排序Java集合


Answers:


155

使用比较器

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。


如果他们想进行多次排序该怎么办?
亨特·麦克米伦

编辑了答案,请检查。显然,如果可以理解如何使用比较器,这并不是什么大问题。如果您可以一次完成,也可以进行n次:)
Kowser 2011年

是的...如果类实现可比,那么就不需要通过比较器...好..ta
Makky 2011年

6
类型Collections中的方法sort(List <T>,Comparator <?super T>)不适用于参数(Collection,Comparator),您无法将Collection传递给令人讨厌的sort方法
gibffe 2012年

5
排序方法适用于列表,而不适用于集合。为了使本示例正常工作,列表变量的类型应更改为“列表”。
埃里克·瓦西里克

34

问题是:“排序集合”。所以你不能使用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<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 2015年

8
谢谢你的回复。真的很感激。4年后仍将错误答案标记为正确答案。谁是坏人?
Aliaksei Yatsau,2015年

2
@Makky因为它回答的是列表,而不是集合
NimChimpsky

11

一个稍有不同的示例说,如果您的类没有实现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()确实已经完成了。
亨特·麦克米伦

区别在于,在此示例中,ClassOne类不是可比较的类,它没有实现Comparable。我只是试图显示一个示例,说明如何使用集合和比较器对非可比较对象进行排序。ClassOne没有compareTo方法..
肖恩·维德

不适

您不会在Java 7或8中找到采用Set的Collections.sort。按照定义,List是元素的有序序列,而Set是无序的元素的独特列表。如果要订购Set,请查看TreeSet
Shawn Vader

7

您应该实现Comparator接口。

例:

public class CustomComparator implements Comparator<CustomObject> 
{
    @Override
    public int compare(CustomObject o1, CustomObject o2) {
        return o1.getId().compareTo(o2.getId());
    }
}

然后,您可以使用Collections类Collections.sort()方法:

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


5

有很多正确的答案,但我还没有找到答案:集合无法排序,您只能遍历它们。

现在您可以遍历它们并创建一个新的sorted something。为此请遵循答案。



4

从Java 8开始,您现在可以使用lambda进行流处理:

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

2

使用sort

您只需要这样做:

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

(或者使用其他人已经说过的下面的版本。)



0

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

0

您可以使用Java自定义类进行排序。


-1

您还可以使用:

Collections.sort(list, new Comparator<CustomObject>() {
    public int compare(CustomObject obj1, CustomObject obj2) {
        return obj1.id - obj2.id;
    }
});
System.out.println(list);

-3

要非常清楚,Collection.sort(list,compartor)不会返回任何内容,因此类似的事情list = Collection.sort(list, compartor);将引发错误(void无法转换为[list type]),而应改为Collection.sort(list, compartor)


完全无关的答案。
Makky
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.