Java Comparator.comParing не сравнивая? - PullRequest
12 голосов
/ 16 мая 2019

После этого вопроса о сортировке списка по другому списку я попытался сделать то же самое - но по какой-то причине это не работает для меня. Чего мне не хватает?

    List<Double> nums = Arrays.asList(5.0, 0.9, 10.4);
    List<Double> order = Arrays.asList(3.0, 1.0, 2.0);
    nums.sort(Comparator.comparing(order::indexOf));
    System.out.println(nums);

    OUTPUT: [5.0, 0.9, 10.4]

Должно быть [0,9, 10,4, 5,0] (согласно order). Что я не правильно делаю?

РЕДАКТИРОВАТЬ: Как большинство из вас заметили, я получил ответ на вопрос, который я связал со всеми неправильно. Вот что я на самом деле хочу сделать.

Ответы [ 4 ]

17 голосов
/ 16 мая 2019

Вы сортируете номера по их позиции в списке order, но ни один из номеров не появляется в списке заказов.В этом случае indexOf вернет -1 для всего, что означает, что все равно всему остальному.В таком случае результирующий порядок сортировки не определен - хотя вы можете реально предположить, что он не изменится.

4 голосов
/ 16 мая 2019

Вы можете составить список пар:

[3.0, 5.0]
[1.0, 0.9]
[2.0, 10.4]

Затем отсортируйте этот список пар по первому значению каждого массива:

[1.0, 0.9]
[2.0, 10.4]
[3.0, 5.0]

Вот код:

List<Double> nums = Arrays.asList(5.0, 0.9, 10.4);
List<Double> order = Arrays.asList(3.0, 1.0, 2.0);

List<Double[]> pairs = new ArrayList<>();
for (int i = 0; i < nums.size(); i++) {
    pairs.add(new Double[] {order.get(i), nums.get(i)});
}

pairs.sort(Comparator.comparing(pair -> pair[0]));

for (Double[] pair : pairs) {
    System.out.print(pair[1] + " ");
}

Вывод:

0.9 10.4 5.0 
2 голосов
/ 16 мая 2019

Обновление

List<Double> nums = Arrays.asList(5.0, 0.9, 10.4);
List<Double> order = Arrays.asList(3.0, 1.0, 2.0);
Map<Double,Double> numToOrder = new HashMap<>();
for (int i = 0; i < nums.size(); ++i) {
    numToOrder.put(nums.get(i), order.get(i));
}
nums.sort(Comparator.comparing(num -> numToOrder.get(num)));
System.out.println(nums);

Оригинальный (неправильный) ответ

(nums изменяется на месте, а ключ возврата лямбды возвращает неверныйрезультаты)

List<Double> nums = Arrays.asList(5.0, 0.9, 10.4);
List<Double> order = Arrays.asList(3.0, 1.0, 2.0);
nums.sort(Comparator.comparing(num -> order.get(nums.indexOf(num))));
System.out.println(nums);
1 голос
/ 16 мая 2019

Компаратор, которому вы предоставляете звонки indexOf за каждые num пройденные. Возвращаемые значения -1 для всех вызовов, поэтому порядок сохраняется как есть.

Вам нужно отсортировать натуральное.

Сортировка по другому списку Double должна быть возможной, но излишне сложной, было бы проще предоставить пользовательский объект, который сортирует по желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...