在Java中,我有一个Set
,我希望将其转换为已排序的List
。 java.util.Collections
包中是否有方法可以为我执行此操作?
答案 0 :(得分:211)
答案provided by the 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);
答案 1 :(得分:71)
排序集:
return new TreeSet(setIWantSorted);
或:
return new ArrayList(new TreeSet(setIWantSorted));
答案 2 :(得分:43)
List myList = new ArrayList(collection);
Collections.sort(myList);
...应该做的伎俩。在适用的情况下添加Generics的味道。
答案 3 :(得分:38)
以下是使用Java 8 Streams的方法:
mySet.stream().sorted().collect(Collectors.toList());
或使用自定义比较器:
mySet.stream().sorted(myComparator).collect(Collectors.toList());
答案 4 :(得分: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 ());
当您需要在同一个对象上使用不同的排序算法时,比较器非常有用(Say emp name,emp salary等)。可以通过将Comparable接口用于所需对象来实现单模式排序。
答案 5 :(得分: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);
}
答案 6 :(得分:3)
您可以将一个集转换为ArrayList
,您可以使用ArrayList
对Collections.sort(List)
进行排序。
以下是代码:
keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);
Collections.sort(list);
答案 7 :(得分:2)
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);
list.addAll(sortedset);
其中originalset = unsorted set和list =要返回的列表
答案 8 :(得分:2)
@Jeremy Stein我想实现相同的代码。我也希望将集合排序为列表,因此不使用Set I将设置值转换为List并按其排序该列表的变量。 这段代码帮助了我,
set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());
答案 9 :(得分:0)
我正在使用这段代码,比上面接受的答案更实用:
List<Thing> thingList = new ArrayList<>(thingSet);
thingList.sort((thing1, thing2) -> thing1.getName().compareToIgnoreCase(thing2.getName()));