JavaにはSet
があり、それをソート済みのList
に変換したいです。 Java.util.Collections
パッケージにこれを行うメソッドがありますか?
答え 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);
並べ替えセット:
return new TreeSet(setIWantSorted);
または:
return new ArrayList(new TreeSet(setIWantSorted));
List myList = new ArrayList(collection);
Collections.sort(myList);
…しかし、トリックを行う必要があります。必要に応じてジェネリックでフレーバーを追加します。
Java 8のStreamsでこれを行う方法は次のとおりです。
mySet.stream().sorted().collect(Collectors.toList());
またはカスタムコンパレータを使用:
mySet.stream().sorted(myComparator).collect(Collectors.toList());
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インターフェイスを使用して実装できます。
それを行うための単一の方法はありません。これを使って:
@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);
}
セットをArrayList
に変換できます。この場合、Collections.sort(List)
を使用してArrayList
をソートできます。
コードは次のとおりです。
keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);
Collections.sort(list);
@Jeremy Stein同じコードを実装したかった。同様に、セットをリストにソートしたかったので、Setを使用する代わりに、セットの値をListに変換し、変数ごとにリストをソートしました。このコードは私を助けてくれました、
set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);
list.addAll(sortedset);
ここで、originalset =ソートされていないセット、list =返されるリスト