sortingJava集合
我有一个Java集合:
Collection<CustomObject> list = new ArrayList<CustomObject>();   CustomObject在显示列表之前有一个id字段,我想用这个id对这个集合进行sorting。 
有没有办法做到这一点?
使用比较器 :
 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。
 问题是:“sorting集合”。 所以你不能使用Collections.sort(List<T> l, Comparator<? super T> comparator) 。 
一些技巧:
对于集合types:
 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 
对于列表types:
 List<String> list = getSomeStringList(); Collections.sort(list, defaultComparator); 
对于Settypes:
 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的types:
 List<String> list = getSomeStringList(); list.sort(String::compareTo); 
一个稍微不同的例子说,如果你有一个类没有实现Comparable,但你仍然想要在字段或方法上进行sorting。
 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; } }); 
在您的customObject上实现Comparable接口。
 你应该实现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()); 
  Comparator方式 
另见
- 分拣-数组列表的
从Java 8开始,您现在可以使用lambda来实现stream:
 list.stream().sorted(Comparator.comparing(customObject::getId)) .foreach(object -> System.out.println(object)); 
使用sorting 。
你只需要这样做:
列表中的所有元素必须实现Comparable接口。
(或者使用下面的版本,正如其他人所说的那样。)
很多正确的答案,但我还没有find这个:集合不能sorting,你只能遍历它们。
 现在你可以迭代它们并创build一个新的sorting的something 。 按照这里的答案。 
SortedSet和Comparator。 比较者应该尊重id域。
 对于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)); 
你也可以使用:
 Collections.sort(list, new Comparator<CustomObject>() { public int compare(CustomObject obj1, CustomObject obj2) { return obj1.id - obj2.id; } }); System.out.println(list); 
- 在什么情况下CopyOnWriteArrayList适合?
- List vs ArrayList vs Dictionary vs Hashtable vs Stack vs Queue?
- AddRange添加到集合
- 不能将List <T>隐式转换为Collection <T>
- Map.get(Object key)不是(完全)generics的原因是什么?
- 将List <DerivedClass>转换为List <BaseClass>
- .NET的HashTable Vs字典 – 字典可以一样快吗?
- jquery如何在数组中find一个Object by属性
- 有没有办法在Rails应用程序中获取所有模型的集合?