2

編集:これは実際にはAndroidアプリケーション用です。つまり、(私の知る限り)HashSetしか使用できません。

Set<String> set = new HashSet<String>();

set.add("1");
set.add("2");
set.add("3");
set.add("4");
set.add("5");
set.add("6");
set.add("7");
set.add("8");

String[] array = set.toArray(new String[0]); // convert the set to an array

System.out.println(Arrays.toString(array)); // test what the set looks like

その出力は[3, 2, 1, 7, 6, 5, 4, 8]

[1, 2, 3, 4, 5, 6, 7, 8]追加した順序で文字列をセットに追加すると想定していたので、期待していました。

私のアプリケーションでは、セットの順序が要素がセットに追加された順序であることが不可欠です。

このセットが故障している理由はありますか? または、要素が追加された順序に戻す方法はありますか?

4

6 に答える 6

7

ほら。

  1. HashSet - 挿入順序を維持しません。
  2. LinkedHashSet - 挿入順序を維持します。
  3. TreeSet - データを自然な順序で保持するか、カスタム順序を定義してコンパレータを渡すことができます。

2番目のオプションを使用できます。

Set<String> set = new LinkedHashSet<String>();
于 2013-12-23T08:33:15.500 に答える
6

LinkedHashSetセットの要素を並べ替える場合は、 a を使用します。詳細については、このリンクを参照してください。

于 2013-12-23T08:26:24.727 に答える
2

データ構造HashSetは、順序付けもソートもされていないコレクションです。要素を自然な順序で並べ替えたい場合は、 TreeSetを使用できます 。挿入順序を使用して維持したい場合は、LinkedHashSetを使用します。

于 2013-12-23T08:27:54.153 に答える
2

いいえ、設計によるものです。AHashSetは、取得速度を最小限に抑える方法で、データに適したバケットに文字列を挿入します。

辞書順を維持したい場合は、TreeSet. (あなたが与えた例では、それ機能しますが、入力データがソートされているためだけです)。

挿入順序を保持したい場合は、LinkedHashSet.

于 2013-12-23T08:28:06.347 に答える
1

はい、理由があり、javadoc の最初の行を読めばわかるはずです。

このクラスは、ハッシュ テーブル (実際には HashMap インスタンス) によってサポートされる Set インターフェイスを実装します。セットの反復順序については保証されません。特に、順序が長期的に一定であることを保証するものではありません。

于 2013-12-23T08:27:40.780 に答える
1

HashSet予測可能な順序を維持しませんhashCode。オブジェクト参照の に依存します。要素が挿入される順序を維持したい場合は、LinkedHashSet. 常にソートされた要素を維持したい場合は、TreeSet.

于 2013-12-23T08:29:23.557 に答える