0

次のコードでは、パラメーターが {1,3,2} の場合、while ループで i は 1、3、2 です。

すでに LinkedHashSet を使用していますが、順序が 1、2、3 でないのはなぜですか? 繰り返しを昇順にするために他に何をする必要がありますか?

o(log n)時はそのままではTreeSet使えません。add, remove, contains()

public static void iterate(int[] num) {
    LinkedHashSet<Integer> set = new LinkedHashSet<Integer>();

    for (int i : num) {
        set.add(i);
    }

    Iterator<Integer> iter = set.iterator();
    while (iter.hasNext()) {
        // WHY IS i THE SAME ORDER AS INSERATION ORDER, NOT ASSENDING ORDER?
        int i = iter.next();
    }
}
4

3 に答える 3

5

LinkedHashSet は挿入順に繰り返され、ソートされないためです! javadoc から:

この実装が HashSet と異なる点は、そのすべてのエントリを実行する二重リンク リストを維持することです。このリンクされたリストは、要素がセットに挿入された順序 (挿入順序) である反復順序を定義します。

ソートされたセットに TreeSet を使用する場合は、ソートされたセットの javadoc を参照してください: https://docs.oracle.com/javase/7/docs/api/java/util/SortedSet.html

于 2014-11-13T13:46:52.227 に答える
1

containsそのため、 LinkedHashSet が追加のデータ構造を保持していることを高速かつ適切に見た HashSet が必要ですが、残念ながら挿入による順序付けが必要です。

上記のコードですべての挿入が表示される場合は、挿入されたデータを事前に並べ替えることができます。

Arrays.sort(num);
Collections.addAll(set, num);

より一般的な解決策は、後でセットを新しいコレクションにコピーして並べ替えることです。

数値が特定の範囲内にある場合、特に正でスパースでない場合は、BitSetを使用できます。該当する場合、それは本当にパフォーマンスの高いソリューションです。

于 2014-11-13T13:57:53.473 に答える