Проблемы с сортировкой списка java? - PullRequest
0 голосов
/ 07 августа 2020

У меня есть один список Я хочу отсортировать его по столбцу. Я использовал следующий код.

    // data is List<List<String>>
    data.sort(Comparator.comparing(e-> e.get(col)));                

Его работа и сортировка по указанному столбцу. Но если я использовал метод reversed() или thenComparing(), он говорит:

error: cannot find symbol
                    data.sort(Comparator.comparing(e-> e.get(col)).reversed()  );
                                                        ^
  symbol:   method get(int)
  location: variable e of type Object

Также с методом thenComparing

error: cannot find symbol
                    data.sort(Comparator.comparing(e-> e.get(col)).thenComparing(e->e.get(col2))  );
                                                        ^
  symbol:   method get(int)
  location: variable e of type Object

error: cannot find symbol
                    data.sort(Comparator.comparing(e-> e.get(col)).thenComparing(e->e.get(col2))  );
                                                                                     ^
  symbol:   method get(int)
  location: variable e of type Object
2 errors

Я ничего не получаю из сообщений об ошибках. Fyi, я использую для этого OpenJDK 11.

1 Ответ

3 голосов
/ 07 августа 2020

Похоже, что java не определяет тип, если у вас есть второй уровень.

В первом примере.

data.sort( Comparator.comparing( e-> e.get(0) ) );

Тип определяется из данных, но в второй пример.

data.sort( Comparator.comparing( e-> e.get(0) ).reversed() );

Тип «сравнения» не подразумевается. Вы можете решить эту проблему двумя способами, самый простой - быть явным.

data.sort( Comparator.comparing( (List<String> e) -> e.get(0) ).reversed() );

Кажется забавным, что java не связывает выводы. Если мы включим промежуточный этап создания компаратора, мы довольно ясно увидим, что это не так.

Comparator<List<String>> c = Comparator.comparing( e-> e.get(0) ).reversed();

| Ошибка: | Не могу найти символ | символ: метод get (int) | Компаратор c = Comparator.comparing (e-> e.get (0)) .reversed (); | ^ --- ^ | Ошибка: | несовместимые типы: java .util.Comparator нельзя преобразовать в java .util.Comparator > | Компаратор c = Comparator.comparing (e-> e.get (0)) .reversed (); | ^ -------------------------------------------- ^

Теперь мы получаем две ошибки: одну в лямбде, потому что аргумент - это объект, и вторая ошибка, потому что мы создаем компаратор. .

Я думаю, это работает Кстати, но я не знаю, как это проверить. 'reversed' примет аргумент типа вызывающего его экземпляра, тип не выводится. К моменту вызова «обратного» объект должен быть создан и назначен generi c. Тогда вызов сравнения не имеет верхней границы, он просто должен вернуть Comparator .

Альтернативное решение, укажите типы при вызове Comparator.

Comparator<List<String>> c = Comparator.<List<String>, String>comparing( e->e.get(0) ).reversed();
...