排序Java集合

Mak*_*kky 74 java sorting collections

我有一个Java集合:

Collection<CustomObject> list = new ArrayList<CustomObject>();
Run Code Online (Sandbox Code Playgroud)

CustomObjectid现在在显示列表之前有一个字段我想按此排序这个集合id.

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

Kow*_*ser 152

使用比较器:

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);
Run Code Online (Sandbox Code Playgroud)

另外,如果CustomObject实现Comparable,那么只需使用Collections.sort(list)

使用JDK 8,语法更简单.

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

更简单

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

简单

List<CustomObject> list = getCustomObjectList();
list.sort(Comparator.comparing(CustomObject::getId));
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)

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

  • 类型集合中的方法sort(List <T>,Comparator <?super T>)不适用于您无法将Collection传递给sort方法的参数(Collection,Comparator),这种方法很烦人 (5认同)
  • 排序方法适用于列表,而不适用于集合.列表变量的类型应更改为List以使此示例起作用. (5认同)

Ali*_*sau 28

问题是:"排序集合".所以你不能使用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
Run Code Online (Sandbox Code Playgroud)

对于列表类型:

List<String> list = getSomeStringList();
Collections.sort(list, defaultComparator);
Run Code Online (Sandbox Code Playgroud)

对于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);
Run Code Online (Sandbox Code Playgroud)

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

List<String> list = getSomeStringList();
list.sort(defaultComparator);
Run Code Online (Sandbox Code Playgroud)

要么

List<String> list = getSomeStringList();
list.sort((String o1, String o2) -> o1.compareTo(o2));
Run Code Online (Sandbox Code Playgroud)

或者对于实现Comparable的类型:

List<String> list = getSomeStringList();
list.sort(String::compareTo);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回复.真的很感激.4年仍然错误的答案标记为正确答案.谁是坏人? (8认同)
  • @Makky因为它是List的答案,而不是集合 (2认同)

Sha*_*der 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;
  }
});
Run Code Online (Sandbox Code Playgroud)


Hun*_*len 6

您应该实现该Comparator接口.

例:

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

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

Collections.sort(list, new CustomComparator());
Run Code Online (Sandbox Code Playgroud)


DwB*_*DwB 5

在customObject上实现Comparable接口.


小智 5

从 Java 8 开始,您现在可以使用 lambda 通过流来完成此操作:

list.stream().sorted(Comparator.comparing(customObject::getId))
             .foreach(object -> System.out.println(object));
Run Code Online (Sandbox Code Playgroud)


est*_*ani 5

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

现在您可以遍历它们并创建一个新的 sorted something. 请按照此处的答案进行操作。