簡體   English   中英

Java Comparator.comparing沒有比較?

[英]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 )。 我做得不對勁?

編輯:正如大多數人注意到的那樣,我得到的回答是我錯誤的問題。 這就是我真正想做的事情。

您按照order列表中的位置對數字進行排序,但order列表中沒有任何數字。 在這種情況下, indexOf將為所有內容返回-1 ,這意味着一切都等於其他所有內容。 在這種情況下,生成的排序順序是未指定的 - 盡管您可以現實地假設它不會更改。

你可以列出一對:

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM