Java Comparator.comparing不能比较?

时间:2019-05-16 09:48:08

标签: java sorting

this question之后,我尝试按照另一个列表对列表进行排序,但是我尝试做同样的事情-但由于某种原因,它对我不起作用。我想念什么?

    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)。我在做什么不对?

编辑:正如您大多数人所注意到的,我得到了与所有错误相关的问题的答案。 Here's what I actually want to do.

4 个答案:

答案 0 :(得分:17)

您正在按数字在order列表中的位置对它们进行排序,但是这些数字都没有出现在顺序列表中。在这种情况下,indexOf will return -1适用于所有内容,这意味着所有内容均等于其他所有内容。在这种情况下,虽然实际上可以假定它不会改变,但是最终的排序顺序是不确定的。

答案 1 :(得分:4)

您可以列出一对:

[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 :(得分:2)

更新

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);

原始答案(错误)

(对数字进行了修改,并且lambda返回键返回了错误的结果)

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);

答案 3 :(得分:1)

您提供的比较器每传递indexOf就会调用num。 在所有调用中返回的值均为-1,因此顺序保持原样。

您需要自然排序。

应该可以用Double的另一个列表进行排序,但是不必要地复杂,提供按需要排序的自定义对象会更简单。