6

何を挿入しても順番に残るHashSet(または任意のコレクションタイプ-ただし、HashSetが最適だと思います)を作成しようとしています。私が取り組んでいるコンタクトマネージャープロジェクト用です。以下の例で実験してきました。

import java.util.*;

public class TestDriver{

    public static void main(String[] args)
    {
        FullName person1 = new FullName("Stephen", "Harper");
        FullName person2 = new FullName("Jason", "Kenney");
        FullName person3 = new FullName("Peter", "MacKay");
        FullName person4 = new FullName("Rona", "Ambrose");
        FullName person5 = new FullName("Rona", "Aabrose");


        HashSet<FullName> names = new HashSet<FullName>();

        names.add(person3);
        names.add(person1);
        names.add(person4);
        names.add(person2);

        System.out.println(names);      
   } 
}

出力では、名前がアルファベット順に並べられることを期待していました。少なくとも、名前または名前のいずれかに従っています。ただし、HashSetがこの順序を作成するために使用した方法を見分けることさえできません。

[Jason Kenney, Rona Ambrose, Stephen Harper, Peter MacKay]

私の質問は、仕様に基づいて名前を並べ替える方法をプログラムにどのように伝えるかです。

4

5 に答える 5

18

HashSetは、エントリに意味のある順序を提供しません。ドキュメントには次のように書かれています。

セットの反復順序については保証されません。特に、順序が時間の経過とともに一定に保たれることを保証するものではありません。

賢明な順序を取得するには、 TreeSetConcurrentSkipListSetなどの別のSet実装を使用する必要があります。SortedSetインターフェースのこれらの実装により、エントリーの順序付け方法を指定するコンパレーターを提供できます。何かのようなもの:

public class SortByLastName implements Comparator<FullName>{
    public int compare(FullName n1, FullName n2) {
        return n1.getLastName().compareTo(n2.getLastName());
    }
}

TreeSet<FullName> names = new TreeSet<FullName>(new SortByLastName());

代わりに、FullNameクラスにComparableインターフェイスを実装させることもできますが、名前、名前、またはその他の基準で並べ替える場合は、役に立たない可能性があります。

于 2012-10-29T20:49:05.330 に答える
12

Treeset自然順序付けに使用します。

HashSet--- not ordered/sorted
LinkedhashSet--- maintains insertion order
TreeSet--- sorts in natural order

代わりにTreeSetを使用してください。

于 2012-10-29T20:50:01.837 に答える
9

HashSet順序を保持しません、比較する方法を指示するためにTreeSetあなた自身を実行して実装してくださいComparatorTreeSet

new TreeSet<FullName>(new Comparator<FullName>(){
        public int compare(Fullname one, FullName two{/*logic*/}
});

見る

于 2012-10-29T20:48:50.933 に答える
4

TreeSetアルファベット順を達成するかLinkedHashSet、挿入順序を維持する必要があるようです。

で使用するには、FullName実装する必要があることに注意してください(または外部コンパレータを提供する必要があります`)。Comparable<FullName>TreeSet

于 2012-10-29T20:49:16.137 に答える
0

これを試して:

 System.out.println(names.toList.sorted)
于 2015-09-01T20:30:50.407 に答える