web-dev-qa-db-ja.com

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

JavaにはSetがあり、それをソート済みのListに変換したいです。 Java.util.Collectionsパッケージにこれを行うメソッドがありますか?

161
Jeremy Stein

答え 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);
211
erickson

並べ替えセット:

return new TreeSet(setIWantSorted);

または:

return new ArrayList(new TreeSet(setIWantSorted));
71
Steve B.
List myList = new ArrayList(collection);
Collections.sort(myList);

…しかし、トリックを行う必要があります。必要に応じてジェネリックでフレーバーを追加します。

43
Esko

Java 8のStreamsでこれを行う方法は次のとおりです。

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

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

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

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 ());

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

9

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

@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);
}
5
Jeremy Stein

セットをArrayListに変換できます。この場合、Collections.sort(List)を使用してArrayListをソートできます。

コードは次のとおりです。

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

@Jeremy Stein同じコードを実装したかった。同様に、セットをリストにソートしたかったので、Setを使用する代わりに、セットの値をListに変換し、変数ごとにリストをソートしました。このコードは私を助けてくれました、

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());
2
Deepak Kumbhar
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);

list.addAll(sortedset);

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

2
Sujith Mohan