如何在 Java 中将一个集合排序为一个列表?

在 Java 中,我有一个 Set,我想把它转换成一个排序的 List。在 java.util.Collections包中是否有一个方法可以为我做到这一点?

332147 次浏览

没有单一的方法可以做到这一点。使用以下方法:

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

排序集:

return new TreeSet(setIWantSorted);

或:

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

... 应该可以做到这一点。添加风味与仿制品在适用的地方。

答案 由业务处提供不是最好的。它是低效的,因为它创建了一个新的 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);

您可以将一个集合转换为 ArrayList,在这里您可以使用 Collections.sort(List)ArrayList进行排序。

密码如下:

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

总是安全的使用比较器或比较接口来提供排序实现(如果对象不是基本数据类型的 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 工资等) ,比较器是很有用的。单模式排序可以通过在所需对象中使用 Compaable 接口来实现。

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


list.addAll(sortedset);

原始集 = 未排序集和列表 = 要返回的列表

以下是如何使用 Java8的 Streams:

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

或使用自定义比较器:

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

@ Jeremy Stein 我想实现同样的代码。我还想对集合进行排序,所以我没有使用 Set,而是将集合的值转换成 List,然后根据变量之一对列表进行排序。 这个代码帮了我,

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

我正在使用这个代码,我发现它比上面公认的答案更实用:

List<Thing> thingList = new ArrayList<>(thingSet);
thingList.sort((thing1, thing2) -> thing1.getName().compareToIgnoreCase(thing2.getName()));