在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.
答案 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
的另一个列表进行排序,但是不必要地复杂,提供按需要排序的自定义对象会更简单。