如何在Java中将集合排序到列表?


169

在Java中,我有一个Set,我想将其转换为sorted Listjava.util.Collections软件包中是否有方法可以为我做到这一点?

Answers:


214

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

3
谢谢!SuppressWarnings总是困扰我。
杰里米·斯坦

4
@sunleo Util该类是包含asSortedList()我编写的方法的类。换句话说,您可以Util自己编写该类,然后将其放入其中。
erickson 2012年

1
哈哈,我认为它来自java.util之类的默认包,谢谢。
sunleo 2012年

3
这可能是一个不错的通用Utility函数,但事实是,它仍然效率不高。通过确保将集合放在正确的容器中来考虑就地排序。还应考虑将TreeSet用作数据的直接容器。如果您的数据无论如何都必须是唯一的,并且您需要一个Set,则使用TreeSet,一次捕获两只苍蝇。
YoYo 2013年

1
作为对那些只阅读最高答案的人们的注释:请看下面的nschum答案,它使用Java 8的流。如果可以使用Java 8,那就去吧。它们更加灵活高效。
2016年

74

排序集:

return new TreeSet(setIWantSorted);

要么:

return new ArrayList(new TreeSet(setIWantSorted));

这是我的第一个想法,但询问者想要一份清单
Alex B

@Alex:这种方法仍然可以使用;返回new ArrayList(new TreeSet(setIWantSorted))
Jonik

1
我实际上使用了此解决方案,但我不建议这样做。正如有关TreeSet的文档所述(请参见download.oracle.com/javase/1.4.2/docs/api/java/util/…),它有效地使用了compareTo()方法而不是equals()方法-如果您集合中有两个对象具有相同的equals()结果,它们将被视为重复项,因此不会被添加到TreeSet中。谨防。
fwielstra 2010年

24
@fwielstra:由于输入也是a,因此如何在输入中具有相等的对象Set
ryanprayogo 2011年

2
@ryanprayogo值得一提的是,它new TreeSet接受Collections,而不仅仅是Sets。并非所有正在阅读此答案的人都将使用a Set,即使这是原始问题所要求的。
克里斯(Chris)

44
List myList = new ArrayList(collection);
Collections.sort(myList);

……但是应该做到这一点。在适当的地方添加带有泛型的风味。


我有一个有用的片段,我想捐赠给社区。当我搜索信息时,找不到。我试图简化下一个人的工作。 stackoverflow.com/questions/18557/…–
杰里米·斯坦

1
是的,可以,但是您提供的链接实际上是在谈论一个真正的问题(即那些没有答案的人,然后找到它)。您在这里的问题只是为了给出答案……我实际上可以输入数百个问题并自己回答;那不是重点!
勒布

5
@Seb:我不同意。我认为这个问题没有错。显然这不是一个非常简单的问题,现在他知道比以前更好的方法!
Michael Myers

3
一个真正的问题,但是在Google提出问题后,我自己找到了答案。当时不存在Stackoverflow。我已经将它发布在我的网站上,并且对其他人有所帮助,所以我认为在这里可能有用。
杰里米·斯坦

奖励:如果您碰巧正在对自己的对象类型进行排序,那么您始终可以实现Comparable和重写compareTo方法。
凌晨

42

使用Java 8的Streams的方法如下:

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

或使用自定义比较器:

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

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

当您需要对同一对象使用不同的排序算法时(例如,emp名称,emp薪水等),Comparator很有用。可以通过使用Comparable接口对所需对象进行单模式排序。


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

还有一个Collections.sort函数,但我认为它做同样的事情。还是+1。
CookieOfFortune 2009年

1
Collections.sort将列表作为参数。
杰里米·斯坦

3

您可以将集合转换为ArrayList,然后可以对ArrayListusing 进行排序Collections.sort(List)

这是代码:

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

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

list.addAll(sortedset);

其中originalset =未排序的集合,list =要返回的列表


TreeSet还会对列表进行重复数据删除,如果您不这样做,则可能导致错误的结果。
anthonymonori

2

@Jeremy Stein我想实现相同的代码。同样,我想对要列出的集合进行排序,因此,与其使用“集”,我不将集合值转换为“列表”,并通过该列表对变量进行排序。这段代码对我有帮助,

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

0

我正在使用此代码,该代码比上面接受的答案更实用:

List<Thing> thingList = new ArrayList<>(thingSet);
thingList.sort((thing1, thing2) -> thing1.getName().compareToIgnoreCase(thing2.getName()));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.