Java Comparator.Comparating不进行比较?
接下来,我将一个列表按另一个列表排序,我尝试做同样的事情——但出于某种原因,这对我不起作用。我错过了什么Java Comparator.Comparating不进行比较?,java,sorting,Java,Sorting,接下来,我将一个列表按另一个列表排序,我尝试做同样的事情——但出于某种原因,这对我不起作用。我错过了什么 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
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]
List nums=Arrays.asList(5.0,0.9,10.4);
列表顺序=Arrays.asList(3.0,1.0,2.0);
nums.sort(Comparator.comparing(order::indexOf));
系统输出打印项次(nums);
输出:[5.0,0.9,10.4]
它应该是[0.9,10.4,5.0](根据顺序)。我做得不对的是什么
编辑:正如你们大多数人所注意到的,我对我链接到的问题的答案全错了 您正在按编号在顺序
列表中的位置对编号进行排序,但没有一个编号出现在顺序列表中。在这种情况下,对于一切,意味着一切都是平等的。在这种情况下,生成的排序顺序是未指定的-尽管您可以实际地假设它不会改变。对于每个传递的num
调用indexOf
的比较器。
所有调用的返回值都是-1
,因此顺序保持不变
你需要自然分类
应该可以按另一个双精度列表进行排序,但不必要地复杂,提供一个自定义对象来根据需要进行排序会更简单。更新
List nums=Arrays.asList(5.0,0.9,10.4);
列表顺序=Arrays.asList(3.0,1.0,2.0);
Map numToOrder=newhashmap();
对于(int i=0;inumToOrder.get(num));
系统输出打印项次(nums);
原始(错误)答案
(nums就地修改,lambda返回键返回错误结果)
List nums=Arrays.asList(5.0,0.9,10.4);
列表顺序=Arrays.asList(3.0,1.0,2.0);
sort(Comparator.comparing(num->order.get(nums.indexOf(num)));
系统输出打印项次(nums);
您可以创建一个配对列表:
[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] + " ");
}
哦,所以我全错了。。那么如何按顺序对nums
进行排序呢?@Michael我相信使用order
作为排序键。@shakedzy我想补充一点,比较器不能满足比较器的要求。这意味着不仅排序顺序未指定,而且排序方法可能引发异常ArrayList
例如AssertionError
。只是为了好玩,我玩了ArrayList
和不同的有缺陷的比较器。我从未得到过总是返回-1的比较器异常,也从未得到过AssertionError
s。然而,对于返回随机整数的比较器,我经常得到。(当然,所有这些都是未指定的且依赖于实现的,因此在JRE:s和版本之间可能会有所不同。)要使其正常工作,每个nums
元素必须按顺序存在,
刚刚对此进行了审核失败。。。我不明白编辑部分是如何被接受的。
0.9 10.4 5.0