我该如何使用Collections.sort()或其他排序方法将Java中的列表排序成字典序?
private List<List<Integer>> possiblePoles = setPoles();
System.out.println(possiblePoles)
[[1, 3, 5], [1, 2, 3]]
我该如何使用Collections.sort()或其他排序方法将Java中的列表排序成字典序?
private List<List<Integer>> possiblePoles = setPoles();
System.out.println(possiblePoles)
[[1, 3, 5], [1, 2, 3]]
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<>());
int c = ObjectUtils.compare(o1.get(i), o2.get(i))
。否则,如果 o1.get(i)==null
,你将获得一个 NPE 错误。(ObjectUtils
是来自 Apache Commons 库) - Michael AndersonpossiblePoles = 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());
对于这个例子[[1,3],[1,2]],如果你想按照两个元素排序,你可以使用Java 8的sorted手动实现比较器方法,验证所有情况,例如以下示例:
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;
});
possiblePoles.sort((l1, l2) -> {
int minLength = Math.min(l1.size(), l2.size());
for (int i = 0; i < minLength; i++) {
int lexicographicalPosition = l1.get(i).compareTo(l2.get(i));
if (lexicographicalPosition != 0) {
return lexicographicalPosition;
}
}
return Integer.compare(l1.size(), l2.size());
});
与Java 8相同的逻辑
尝试使用这段代码。
Collections.sort(list, (a,b) -> a.get(0) - b.get(0));