1

かなり初心者の質問だと思いますが、これをさまざまな方法で行うのに6時間以上費やしましたが、最善の方法がわからないので、どのようにサポートするかについて助けを求めています.

車と自転車など、2つの列挙型があります。list内部に 2 ~ 1 000 000 の要素を持つor array(どちらが優れているかはわかりません) を作成する必要があり、それが完了したら、/ (最初に自転車、最後に車) を並べ替える必要がありlistますarray。バイクと車しかありませんが、数百台、数千台、またはそれ以上の台数が存在する可能性があります。EnumMap約2つの列挙型を作成できるかどうかはわかりません。

EnumMapEnumMapはキーと値を持っているので、キー「車」と値「0」、キー「バイク」値「1」を指定したので、並べ替えが簡単になりますが、でこれを行うことができないことがわかりました。どれだけ要素を追加しても、常にバイクと車の 2 つしかありません。そこに何百人も話すことはできないと思います。

配列に焦点を当てていない理由は、コードの最初にあるenum garage {bike, car};

はい、これは宿題ですが、誰かが私のためにそれを行うのではなく、それを行う方法を見つけたいと思っています(さまざまなアプローチを読んで試すだけで何時間も費やしました)。

4

3 に答える 3

1

ロジックを 2 つのメソッドに分割することをお勧めします。最初にcountGoats(Animal[])-

private static int countGoats(Animal[] animals) {
    int count = 0;
    for (Animal a : animals) {
        if (Animal.goat == a) {
            count++;
        }
    }
    return count;
}

goatscountまでのgoatすべての要素 (および a の後のすべての要素sheep) は配列内にある必要があるため、次のような方法で配列を反復処理できます。

public static void reorder(Animal[] animals) {
    if (animals == null) {
        return;
    }
    int goats = countGoats(animals);
    for (int i = 0; i < animals.length; i++) {
        // if (i < goats) - it's a goat, otherwise it's a sheep.
        animals[i] = (i < goats) ? Animal.goat : Animal.sheep;
    }
}

これはカウンティング ソートの例であり、実行時の複雑度は O(n) です。ウィキペディアの記事にあるように、

カウントソートは配列へのインデックスとしてキー値を使用するため、比較ソートではなく、比較ソートの Ω(n log n) 下限は適用されません。

于 2014-09-13T01:31:37.737 に答える