Java集合排序

86

我有一个Java集合:

Collection<CustomObject> list = new ArrayList<CustomObject>();

CustomObject现在有一个id字段,我想在显示列表之前按照这个id对该集合进行排序。

有没有任何方法可以做到这一点?


可能是如何对Collection<T>进行排序?的重复问题。 - Hamdi
15个回答

168

使用Comparator

List<CustomObject> list = new ArrayList<CustomObject>();
Comparator<CustomObject> comparator = new Comparator<CustomObject>() {
    @Override
    public int compare(CustomObject left, CustomObject right) {
        return left.getId() - right.getId(); // use your logic
    }
};

Collections.sort(list, comparator); // use the comparator as much as u want
System.out.println(list);

此外,如果CustomObject实现了Comparable接口,则只需使用Collections.sort(list)

在JDK 8中语法更加简单。

List<CustomObject> list = getCustomObjectList();
Collections.sort(list, (left, right) -> left.getId() - right.getId());
System.out.println(list);

更简单了

List<CustomObject> list = getCustomObjectList();
list.sort((left, right) -> left.getId() - right.getId());
System.out.println(list);

最简单的

List<CustomObject> list = getCustomObjectList();
list.sort(Comparator.comparing(CustomObject::getId));
System.out.println(list);

显然,初始代码也可以用于JDK 8。


如果他们想要进行多次排序怎么办? - Hunter McMillen
如果类实现了Comparable接口,那么就不需要传递比较器了...很好... - Makky
谁给了负评,你能告诉我吗?拜托了?也许我可以学到更好的东西。 - Kowser
6
Collections类中的sort(List<T>, Comparator<? super T>)方法不适用于参数(Collection, Comparator),你不能将Collection传递给sort方法,这非常令人烦。 - gibffe
5
排序方法适用于列表,而不是集合。为了使这个例子起作用,列表变量的类型应该更改为List。 - Eric Vasilik
显示剩余2条评论

36

问题是:“排序集合”。因此,您不能使用Collections.sort(List<T> l, Comparator<? super T> comparator)

一些提示:

对于集合类型:

Comparator<String> defaultComparator = new Comparator<String>() {
   @Override
   public int compare(String o1, String o2) {
       return o1.compareTo(o2);
   }
};

Collection<String> collection = getSomeStringCollection();
String[] strings = collection.toArray(new String[collection.size()]);
Arrays.sort(strings, defaultComparator);
List<String> sortedStrings = Arrays.asList(strings);

Collection<String> collection = getSomeStringCollection();
List<String> list = new ArrayList(collection);
Collections.sort(list, defaultComparator);
collection = list; // if you wish

对于列表类型:

List<String> list = getSomeStringList();
Collections.sort(list, defaultComparator);

对于Set类型:

Set<String> set = getSomeStringSet();
// Than steps like in 'For Collection type' section or use java.util.TreeSet
// TreeSet sample:
// Sorted using java.lang.Comparable.
Set<String> naturalSorted = new TreeSet(set);

Set<String> set = getSomeStringSet();
Set<String> sortedSet = new TreeSet(defaultComparator);
sortedSet.addAll(set);

Java 8 版本. 存在 java.util.List#sort(Comparator<? super E> c) 方法

List<String> list = getSomeStringList();
list.sort(defaultComparator);
或者
List<String> list = getSomeStringList();
list.sort((String o1, String o2) -> o1.compareTo(o2));

或者对于实现了Comparable接口的类型:

List<String> list = getSomeStringList();
list.sort(String::compareTo);

我4年前问了这个问题,现在你回答了。 - Makky
10
谢谢您的回复,非常感激。四年过去了,错误的答案仍被标记为正确答案。谁是坏人? - Aliaksei Yatsau
3
因为它针对列表回答,而不是集合。 - NimChimpsky

12

如果你有一个类,它没有实现Comparable接口但是你仍然想按照字段或方法排序的话,可以使用稍微不同的示例。

Collections.sort(allMatching, new Comparator<ClassOne>() {
  @Override public int compare(final ClassOne o1, final ClassOne o2) {
    if (o1.getMethodToSort() > o2.getMethodToSort()) {
      return 1;
    } else if (o1.getMethodToSort() < o2.getMethodToSort()) {
      return -1;
    }  
    return 0;
  }
});

你实现的 if 语句与 compareTo() 的功能完全相同。 - Hunter McMillen
不同之处在于,在这个例子中,类ClassOne不是一个可比较的类,它没有实现Comparable接口。我只是想展示一个如何使用集合和比较器来对非可比较对象进行排序的例子。ClassOne没有compareTo方法。 - Shawn Vader
不适用于Java 6(Collections.sort仅限于List)。 - phil294
在Java 7或8中,您不会找到一个接受Set的Collections.sort。按照定义,List是元素的有序序列,而Set是无序的不同元素列表。如果您想在Set中进行排序,请查看TreeSet。 - Shawn Vader

8
您应该实现 Comparator 接口。
示例:
public class CustomComparator implements Comparator<CustomObject> 
{
    @Override
    public int compare(CustomObject o1, CustomObject o2) {
        return o1.getId().compareTo(o2.getId());
    }
}

您可以使用集合类的 Collections.sort() 方法:

Collections.sort(list, new CustomComparator());

5

从Java 8开始,您现在可以使用lambda表达式通过流来执行此操作:

list.stream().sorted(Comparator.comparing(customObject::getId))
             .foreach(object -> System.out.println(object));

5
很多答案都是正确的,但我还没有找到这个: 集合不能被排序,你只能遍历它们。
现在你可以遍历它们并创建一个新的已排序的something。按照此处的答案进行操作。

5

4

2

使用 sort 方法。

你只需要执行以下操作:

列表中的所有元素都必须实现 Comparable 接口。

(或者使用下面的版本,正如其他人已经指出的那样。)


1

使用Java 8,您有多种选择,可以结合方法引用和内置的comparing比较器:

import static java.util.Comparator.comparing;

Collection<CustomObject> list = new ArrayList<CustomObject>();

Collections.sort(list, comparing(CustomObject::getId));
//or
list.sort(comparing(CustomObject::getId));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接