Словарная сортировка ArrayList из Arraylist<Integer> в java

Я хочу отсортировать 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;
    }
});

Но для некоторых входных данных это не дает результата сортировки по словарю.

Да, но что такое словарь? И какой желаемый результат?

LppEdd 23.03.2019 11:01

метод compare никогда не возвращает 0. а если все элементы равны?

Sharon Ben Asher 23.03.2019 11:06

какой тип вывода вы хотите

Onkar Musale 23.03.2019 11:07

Компаратор какой-то странный. Он сравнивает два списка целых чисел по первому найденному различию (то есть список [1,6,2,3,8] будет меньше, чем [1,6,3,0,1]), потому что первое различие находится в индексе 2 и число 2 меньше 3, остальное игнорируется. Я не знаю, к чему такое сравнение. Возможно исключение IndexOutOfBoundsException, если первый список длиннее второго и элементы равны. Еще одно странное поведение: компаратор считает первый список «меньше» (возвращает -1), чем второй, если они одинаковы...

bambula 23.03.2019 11:13

@bambula Этот тип компараторов имеет смысл для номеров версий и некоторых других вещей. Концепция здравая, вот только реализация сломана.

Roland Illig 23.03.2019 11:24

И что такое "некоторый вклад". Не заставляйте нас гадать, вместо этого предоставьте нам подробности.

Roland Illig 23.03.2019 11:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
217
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функции сравнения, содержащие 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.

Наиболее важным паттерном в этом стиле является:

  1. Сравните по первому критерию.
  2. Если заданные значения различаются, верните результат сравнения и сделайте это.
  3. Возьмите следующий критерий, продолжите с шага 1.
  4. Если критериев не осталось, вернуть 0.

Другие вопросы по теме