Я хочу отсортировать ArrayList из ArrayList<Integer>, как это выглядит.
ArrayList<ArrayList<Integer>> allres = new ArrayList<ArrayList<Integer>>();
Collections.sort(allres, new Comparator<ArrayList<Integer>>() {
public int compare(ArrayList<Integer> a, ArrayList<Integer> b) {
for (int i = 0; i < a.size(); i++) {
if (a.get(i) < b.get(i)) {
return -1;
} else if (a.get(i) == b.get(i)) {
continue;
} else {
return 1;
}
}
return -1;
}
});
Но для некоторых входных данных это не дает результата сортировки по словарю.
метод compare никогда не возвращает 0. а если все элементы равны?
какой тип вывода вы хотите
Компаратор какой-то странный. Он сравнивает два списка целых чисел по первому найденному различию (то есть список [1,6,2,3,8] будет меньше, чем [1,6,3,0,1]), потому что первое различие находится в индексе 2 и число 2 меньше 3, остальное игнорируется. Я не знаю, к чему такое сравнение. Возможно исключение IndexOutOfBoundsException, если первый список длиннее второго и элементы равны. Еще одно странное поведение: компаратор считает первый список «меньше» (возвращает -1), чем второй, если они одинаковы...
@bambula Этот тип компараторов имеет смысл для номеров версий и некоторых других вещей. Концепция здравая, вот только реализация сломана.
И что такое "некоторый вклад". Не заставляйте нас гадать, вместо этого предоставьте нам подробности.




Функции сравнения, содержащие 1 или -1, подвержены ошибкам.
Вместо этого вы должны написать это так:
public static int lexicographically(List<Integer> a, List<Integer> b) {
for (int i = 0, end = Math.min(a.size(), b.size()); i < end; i++) {
int res = Integer.compare(a.get(i), b.get(i));
if (res != 0)
return res;
}
return Integer.compare(a.size(), b.size());
}
Этот стиль написания функций сравнения предотвращает различные распространенные ошибки, такие как никогда не возвращаемый 0.
Наиболее важным паттерном в этом стиле является:
Да, но что такое словарь? И какой желаемый результат?