[英]Java Comparator.comparing not comparing?
在關於按另一個列表對列表進行排序的這個問題之后,我嘗試做同樣的事情 - 但是由於某些原因它對我不起作用。 我錯過了什么?
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
)。 我做得不對勁?
編輯:正如大多數人注意到的那樣,我得到的回答是我錯誤的問題。 這就是我真正想做的事情。
你可以列出一對:
[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
更新
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被修改到位,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);
您提供的比較器為每個傳遞的num
調用indexOf
。 所有調用的返回值均為-1
,因此順序保持原樣。
你需要自然排序。
按另一個Double
列表進行排序應該是可能的,但是不必要地復雜,提供一個根據需要排序的自定義Object會更簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.