Javaでセットをリストにソートするにはどうすればよいですか?


回答:


214

OPによって提供される答えは最良ではありません。それは新しい作成しますように、それは、非効率的であるList 、不要な新しい配列を。また、ジェネリック配列に関するタイプセーフティの問題のため、「チェックされていない」警告が発生します。

代わりに、次のようなものを使用します。

public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
  List<T> list = new ArrayList<T>(c);
  java.util.Collections.sort(list);
  return list;
}

次に使用例を示します。

Map<Integer, String> map = new HashMap<Integer, String>();
/* Add entries to the map. */
...
/* Now get a sorted list of the *values* in the map. */
Collection<String> unsorted = map.values();
List<String> sorted = Util.asSortedList(unsorted);

3
ありがとう!そのSuppressWarningsはいつも私を悩ませました。
ジェレミースタイン

4
@sunleo Utilクラスは、asSortedList()私が作成したメソッドを含むクラスです。つまり、Utilクラスを自分で作成し、そのコードをその中に入れます。
エリクソン2012年

1
ハハハハハハハハハハハハハハハハハハハハハハハハハハハ。
sunleo

3
これは優れた汎用ユーティリティ関数かもしれませんが、実際はまだ効率的ではありません。最初に適切なコンテナにセットがあることを確認して、インプレースソートを検討してください。また、TreeSetをデータの直接コンテナとして使用することも検討してください。とにかくデータを一意にする必要があり、セットが必要な場合は、ツリーセットを使用して、1つのスワットで2つのハエをキャッチします。
ヨーヨー2013

1
一番上の答えだけを読んでいる人へのメモとして:Java 8のストリームを使用する以下のnschumの答えを見てください。Java 8を使用できる場合は、それを試してください。それらはより柔軟で効率的です。
Felk

74

ソートされたセット:

return new TreeSet(setIWantSorted);

または:

return new ArrayList(new TreeSet(setIWantSorted));

これは私の最初の考えでしたが、質問者はリストを望んでいました
Alex B

@Alex:このアプローチは引き続き使用できます。新しいArrayList(new TreeSet(setIWantSorted))を
返す

1
私は実際にこのソリューションを使用しましたが、これはお勧めしません。TreeSetのドキュメントに記載されているように(download.oracle.com/javase/1.4.2/docs/api/java/util/…を参照)、equals()メソッドの代わりにcompareTo()メソッドを効果的に使用しています。セットに同じequals()結果を持つ2つのオブジェクトがある場合、それらは重複として表示され、そのため、TreeSetに追加されません。注意してください。
fwielstra 2010

24
@fwielstra:入力もaなので、どのように入力が等しいオブジェクトを持つことができますSetか?
ryanprayogo 2011

2
@ryanprayogo sだけではなくs もnew TreeSet受け入れるため、言及する価値があります。この回答を読んでいるすべての人がを使用するわけではありませんが、それは元の質問が求めているものです。CollectionSetSet
クリス

44
List myList = new ArrayList(collection);
Collections.sort(myList);

…しかしトリックをするべきです。必要に応じてGenericsでフレーバーを追加します。


コミュニティに寄付したい便利なスニペットがありました。探してみたが見つからなかった。次の人の仕事が楽になるように努力していました。 stackoverflow.com/questions/18557/...
ジェレミー・スタイン

1
ええ、確かに、あなたが提供したそのリンクは、実際に本当の質問(つまり、答えのないものを見つけて、それを見つけてください)について話しています。ここでのあなたの質問は答えを出すことだけでした...私は実際に何百もの質問を入力して自分で答えることができました。それはポイントではありません!
セブ

5
@Seb:同意しません。この質問に問題はないと思います。それは明らかに非常に単純な質問ではなく、今では彼は以前よりも良い方法を知っています!
マイケルマイヤーズ

3
それ本当の質問でし、Googleが不足してから自分で答えを見つけました。Stackoverflowは当時存在しませんでした。私はそれを私のウェブサイトに投稿してもらい、それが他の誰かを助けるので、私はそれがここで役に立つかもしれないと思いました。
ジェレミースタイン

おまけ:そして、あなたがたまたまあなた自身のオブジェクト型をソートしているなら、あなたはいつでもメソッドを実装ComparableしてオーバーライドすることができますcompareTo
nabster

42

Java 8のストリームでそれを行う方法は次のとおりです。

mySet.stream().sorted().collect(Collectors.toList());

またはカスタムコンパレータを使用して:

mySet.stream().sorted(myComparator).collect(Collectors.toList());

9

ComparatorまたはComparableインターフェースのいずれかを使用してソートの実装を提供しても常に安全です(オブジェクトがプリミティブデータ型のStringクラスまたはWrapperクラスでない場合)。名前に基づいて従業員をソートするコンパレータ実装の例として

    List<Employees> empList = new LinkedList<Employees>(EmpSet);

    class EmployeeComparator implements Comparator<Employee> {

            public int compare(Employee e1, Employee e2) {
                return e1.getName().compareTo(e2.getName());
            }

        }

   Collections.sort(empList , new EmployeeComparator ());

コンパレータは、同じオブジェクト(たとえば、emp名、emp salaryなど)に異なるソートアルゴリズムが必要な場合に役立ちます。シングルモードの並べ替えは、必要なオブジェクトにComparableインターフェイスを使用することで実装できます。


5

それを行う単一の方法はありません。これを使って:

@SuppressWarnings("unchecked")
public static <T extends Comparable> List<T> asSortedList(Collection<T> collection) {
  T[] array = collection.toArray(
    (T[])new Comparable[collection.size()]);
  Arrays.sort(array);
  return Arrays.asList(array);
}

Collections.sort関数もありますが、同じことをすると思います。とにかく+1。
CookieOfFortune 2009

1
Collections.sortはパラメーターとしてリストを受け取ります。
ジェレミー・スタイン

3

セットをに変換してArrayListArrayListを使用して並べ替えることができますCollections.sort(List)

これがコードです:

keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);     
Collections.sort(list);

3
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);

list.addAll(sortedset);

ここで、originalset =ソートされていないセット、list =返されるリスト


TreeSetはリストを重複除外します。これを想定しない場合、誤った結果になる可能性があります。
anthonymonori

2

@Jeremy Stein同じコードを実装したかった。同様に、セットをリストにソートしたかったので、セットを使用する代わりに、セット値をリストに変換し、そのリストを変数の1つに基づいてソートしました。このコードは私を助けました、

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());

0

私はこのコードを使用していますが、上記の受け入れられた回答よりも実用的です。

List<Thing> thingList = new ArrayList<>(thingSet);
thingList.sort((thing1, thing2) -> thing1.getName().compareToIgnoreCase(thing2.getName()));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.