【发布时间】:2010-10-18 22:12:13
【问题描述】:
在 Java 中,我有一个 Set,我想把它变成一个排序好的 List。 java.util.Collections 包中是否有可以为我执行此操作的方法?
【问题讨论】:
标签: java sorting collections
在 Java 中,我有一个 Set,我想把它变成一个排序好的 List。 java.util.Collections 包中是否有可以为我执行此操作的方法?
【问题讨论】:
标签: java sorting collections
我正在使用这段代码,我发现它比上面接受的答案更实用:
List<Thing> thingList = new ArrayList<>(thingSet);
thingList.sort((thing1, thing2) -> thing1.getName().compareToIgnoreCase(thing2.getName()));
【讨论】:
@Jeremy Stein 我想实现相同的代码。我也想将集合排序为列表,因此我没有使用 Set 将集合值转换为 List 并按它的一个变量对该列表进行排序。 这段代码帮助了我,
set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());
【讨论】:
以下是使用 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 接口来实现。
【讨论】:
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);
list.addAll(sortedset);
其中 originalset = 未排序的集合,list = 要返回的列表
【讨论】:
答案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);
【讨论】:
Util 类是包含我编写的asSortedList() 方法的类。换句话说,您自己编写 Util 类,然后将代码放入其中。
您可以将集合转换为ArrayList,在其中您可以使用Collections.sort(List) 对ArrayList 进行排序。
代码如下:
keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);
Collections.sort(list);
【讨论】:
List myList = new ArrayList(collection);
Collections.sort(myList);
... 但是应该可以解决问题。在适用的情况下使用泛型添加风味。
【讨论】:
Comparable 并覆盖 compareTo 方法。
排序集:
return new TreeSet(setIWantSorted);
或:
return new ArrayList(new TreeSet(setIWantSorted));
【讨论】:
Set,你怎么能在输入中有相等的对象?
new TreeSet 接受Collections,而不仅仅是Sets。并非所有阅读此答案的人都会使用Set,即使这是最初的问题所要问的。
没有单一的方法可以做到这一点。使用这个:
@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);
}
【讨论】: