Чтобы сравнить 2 подсписка, вам нужно найти первую неравную пару и сравнить их значение (если оба начинаются как 32
, вам нужно посмотреть следующее значение, чтобы увидеть)
List<List<Integer>> graph = new ArrayList<>();
graph.add(Arrays.asList(3, 8, 6));
graph.add(Arrays.asList(2, 14, 205, 44, 1));
graph.add(Arrays.asList(2, 14, 205, 44, 2));
graph.add(Arrays.asList(1, 3));
graph.add(Arrays.asList(1, 4));
graph.add(Arrays.asList(1, 4));
graph.add(Arrays.asList(1, 4, 5));
graph.sort((o1, o2) -> {
int indice, cmp, min;
for (indice = 0, min = Math.min(o1.size(), o2.size());
indice < min; indice++) {
if ((cmp = Integer.compare(o1.get(indice), o2.get(indice))) != 0) {
return cmp;
}
}
if (indice == o1.size()) return -1;
if (indice == o2.size()) return 1;
return 0;
});
System.out.println(graph);
[[1, 3],
[1, 4],
[1, 4],
[1, 4, 5],
[2, 14, 205, 44, 1],
[2, 14, 205, 44, 2],
[3, 8, 6]]
С другой стороны, используя Comparator
интерфейс (я согласен, что это не очень хорошо), он сравнивает значение до одного из списка, если он пуст, тогда он будет сравнивать размер, если достигнет одного полностью
graph.sort((o1, o2) -> {
Comparator<List<Integer>> cc = Comparator.comparingInt(l -> l.get(0));
int indice, min;
for (indice = 0, min = Math.min(o1.size(), o2.size()); indice < min; indice++) {
final int i = indice;
cc = cc.thenComparingInt(l -> l.get(i));
}
return cc.thenComparingInt(List::size).compare(o1, o2);
});