我有一个Java集合:
Collection<CustomObject> list = new ArrayList<CustomObject>();
CustomObject
现在有一个id
字段,我想在显示列表之前按照这个id
对该集合进行排序。
有没有任何方法可以做到这一点?
我有一个Java集合:
Collection<CustomObject> list = new ArrayList<CustomObject>();
CustomObject
现在有一个id
字段,我想在显示列表之前按照这个id
对该集合进行排序。
有没有任何方法可以做到这一点?
使用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)
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。
问题是:“排序集合”。因此,您不能使用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);
如果你有一个类,它没有实现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;
}
});
compareTo()
的功能完全相同。 - Hunter McMillenComparator
接口。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());
从Java 8开始,您现在可以使用lambda表达式通过流来执行此操作:
list.stream().sorted(Comparator.comparing(customObject::getId))
.foreach(object -> System.out.println(object));
something
。按照此处的答案进行操作。使用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));