web-dev-qa-db-ja.com

ハッシュセットの例を注文しますか?

HashSetで比較可能なクラスを使用して昇順を取得する方法の例が必要です。次のようなHashSetがあるとします。

HashSet<String> hs = new HashSet<String>();

hsを昇順にするにはどうすればよいですか?

20
Jony

代わりに TreeSet を使用してください。 Comparator をとるコンストラクタがあります。 Setを自動的にソートします。

HashSetTreeSetに変換する場合は、次のようにします。

Set<YourObject> hashSet = getItSomehow();
Set<YourObject> treeSet = new TreeSet<YourObject>(new YourComparator());
treeSet.addAll(hashSet);
// Now it's sorted based on the logic as implemented in YourComparator.

あなたが持っているアイテムがすでに Comparable を実装していて、そのデフォルトの順序付け順序がすでに望んでいるものである場合、基本的にComparatorを指定する必要はありません。次に、TreeSetに基づいてHashSetを直接作成できます。例えば。

Set<String> hashSet = getItSomehow();
Set<String> treeSet = new TreeSet<String>(hashSet);
// Now it's sorted based on the logic as implemented in String#compareTo().

以下も参照してください。

45
BalusC

HashSet "セットの反復順序に関する保証はありません。"代わりに LinkedHashSet を使用してください。

補遺:私は Comparable の実装に関する@BalusCのポイントを2番目に示し、「予測可能な反復順序」を提供する LinkedHashSet を少し優先します。 .. TreeSet に関連するコストの増加を招くことなく。」

補遺:@Stephenは重要なポイントを提起し、@ BalusCのTreeMapの提案を支持します。 LinkedHashSetは、データが(ほぼ)静的で、既に並べ替えられている場合にのみ、より効率的な方法です。

8
trashgod

HashSets 反復順序を保証しない

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

反復順序を制御できるようにしたい場合は、おそらく 別のデータ構造 を選択する必要があります(または実際に1つだけあります!)

1
Gian