20

HashSet昇順を取得するために、で同等のクラスを使用する方法の例が必要です。私がこのようなものを持っているとしましょうHashSet

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

どうすればhs昇順になりますか?

4

3 に答える 3

46

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、そのデフォルトの順序がすでに必要なものである場合は、基本的にを指定する必要はありませんComparatorTreeSet次に、に基づいて直接構築でき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().

参照:

于 2010-08-01T00:49:13.973 に答える
8

HashSet「セットの反復順序については保証しません。」LinkedHashSet代わりに使用してください。

補遺:@ BalusCの実装についての2番目のポイントであり、「に関連するコストの増加を招くことなく、予測可能な反復順序...」を提供Comparableするのわずかな好みを表現します。LinkedHashSetTreeSet

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

于 2010-08-01T00:41:48.440 に答える
1

HashSetsは反復順序を保証しません

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

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

于 2010-08-01T00:42:53.243 に答える