如何使用Collections.sort()或其他排序方法按字典序对Java语言中的列表列表进行排序?
private List<List<Integer>> possiblePoles = setPoles();
System.out.println(possiblePoles)
[[1, 3, 5], [1, 2, 3]]发布于 2016-03-03 10:17:47
您必须实现自己的Comparator类并将一个实例传递给Collections.sort()
class ListComparator<T extends Comparable<T>> implements Comparator<List<T>> {
@Override
public int compare(List<T> o1, List<T> o2) {
for (int i = 0; i < Math.min(o1.size(), o2.size()); i++) {
int c = o1.get(i).compareTo(o2.get(i));
if (c != 0) {
return c;
}
}
return Integer.compare(o1.size(), o2.size());
}
}那么排序就很容易了
List<List<Integer>> listOfLists = ...;
Collections.sort(listOfLists, new ListComparator<>());发布于 2018-09-28 14:02:20
使用Java8 stream API改进了MartinS回答
possiblePoles = possiblePoles.stream().sorted((o1,o2) -> {
for (int i = 0; i < Math.min(o1.size(), o2.size()); i++) {
int c = o1.get(i).compareTo(o2.get(i));
if (c != 0) {
return c;
}
}
return Integer.compare(o1.size(), o2.size());
}).collect(Collectors.toList());发布于 2021-04-28 09:39:29
对于这个示例[1,3,1,2],如果您想要按这两个元素对列表进行排序,您可以使用从Java 8手动实现的排序的比较方法,验证所有情况,如以下示例所示:
List<List<Integer>> result = contests.stream().sorted((o1, o2) -> {
if (o1.get(1) > o2.get(1) ||
(o1.get(1).equals(o2.get(1)) && o1.get(0) > o2.get(0))) {
return -1;
} else if (o1.get(1) < o2.get(1) ||
(o1.get(1).equals(o2.get(1)) && o1.get(0) < o2.get(0))) {
return 1;
}
return 0;
}).collect(Collectors.toList());或
contests.sort((o1, o2) -> {
if (o1.get(1) > o2.get(1) ||
(o1.get(1).equals(o2.get(1)) && o1.get(0) > o2.get(0))) {
return -1;
} else if (o1.get(1) < o2.get(1) ||
(o1.get(1).equals(o2.get(1)) && o1.get(0) < o2.get(0))) {
return 1;
}
return 0;
});https://stackoverflow.com/questions/35761864
复制相似问题