HashSet
で比較可能なクラスを使用して昇順を取得する方法の例が必要です。次のようなHashSet
があるとします。
HashSet<String> hs = new HashSet<String>();
hs
を昇順にするにはどうすればよいですか?
代わりに TreeSet
を使用してください。 Comparator
をとるコンストラクタがあります。 Set
を自動的にソートします。
HashSet
をTreeSet
に変換する場合は、次のようにします。
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().
HashSet
"セットの反復順序に関する保証はありません。"代わりに LinkedHashSet
を使用してください。
補遺:私は Comparable
の実装に関する@BalusCのポイントを2番目に示し、「予測可能な反復順序」を提供する LinkedHashSet
を少し優先します。 .. TreeSet
に関連するコストの増加を招くことなく。」
補遺:@Stephenは重要なポイントを提起し、@ BalusCのTreeMap
の提案を支持します。 LinkedHashSet
は、データが(ほぼ)静的で、既に並べ替えられている場合にのみ、より効率的な方法です。
HashSets 反復順序を保証しない :
このクラスは、ハッシュテーブル(実際にはHashMapインスタンス)に基づくSetインターフェースを実装します。セットの反復順序については保証されません。特に、順序が長期にわたって一定であることを保証するものではありません。このクラスはnull要素を許可します。
反復順序を制御できるようにしたい場合は、おそらく 別のデータ構造 を選択する必要があります(または実際に1つだけあります!)