排序Java集合

时间:2011-08-05 14:08:50

标签: java sorting collections

我有一个Java集合:

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

CustomObject现在在显示列表之前有id字段我想按id对此集合进行排序。

我有什么方法可以做到这一点?

13 个答案:

答案 0 :(得分:149)

使用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.

答案 1 :(得分:27)

问题是:&#34;排序集合&#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);

答案 2 :(得分: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;
  }
});

答案 3 :(得分:6)

您应该实现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());

答案 4 :(得分:5)

在customObject上实现Comparable接口。

答案 5 :(得分:4)

答案 6 :(得分:4)

很多正确的答案,但我没有找到这个: 集合无法排序,您只能通过它们进行迭代。

现在,您可以迭代它们并创建一个新的已排序something。按照这里的答案。

答案 7 :(得分:2)

使用sort

你必须这样做:

  

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

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

答案 8 :(得分:0)

SortedSet和比较者。比较者应该尊重 id 字段。

答案 9 :(得分: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));

答案 10 :(得分:0)

您可以使用java Custom Class进行排序。

答案 11 :(得分:-2)

您也可以使用:

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

答案 12 :(得分:-3)

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