【发布时间】:2011-10-20 22:05:26
【问题描述】:
我有一个 Java 集合:
Collection<CustomObject> list = new ArrayList<CustomObject>();
CustomObject 在显示列表之前现在有一个id 字段我想按id 对这个集合进行排序。
有什么办法可以做到吗?
【问题讨论】:
标签: java sorting collections
我有一个 Java 集合:
Collection<CustomObject> list = new ArrayList<CustomObject>();
CustomObject 在显示列表之前现在有一个id 字段我想按id 对这个集合进行排序。
有什么办法可以做到吗?
【问题讨论】:
标签: java sorting collections
使用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);
另外,如果CustomObjectimplements 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<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() 所做的完全一样。
您应该实现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());
【讨论】:
在您的 customObject 上实现 Comparable 接口。
【讨论】:
从 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));
【讨论】:
SortedSet 和比较器。比较器应该尊重 id 字段。
【讨论】:
您可以使用 java Custom Class 进行排序。
【讨论】:
你的例子:
Collection<CustomObject> list = new ArrayList<CustomObject>();
您也可以使用比较器:
list.sort(Comparator.comparingLong(CustomObject::getSomethingToCompare));
只要替换掉 compareLong 方法,有很多选择,但取决于你想在 "getSomethingToCompare" 上传递什么。
这个link 也可能有帮助。
【讨论】:
你也可以使用:
Collections.sort(list, new Comparator<CustomObject>() {
public int compare(CustomObject obj1, CustomObject obj2) {
return obj1.id - obj2.id;
}
});
System.out.println(list);
【讨论】:
非常清楚,Collection.sort(list, compartor) 不返回任何东西,所以像这样的list = Collection.sort(list, compartor); 会抛出一个错误(void 不能转换为 [list type]),而应该是 Collection.sort(list, compartor)
【讨论】: