簡體   English   中英

將映射鍵從集合轉換為雙精度 - java

[英]Convert map key from collection to double - java

我有一個Map<String, List<Double>>並且由此我想得到一個 SORTED Map<String, Double>其中兩個地圖中的鍵相同但第二個地圖中的值是來自先貼圖再排序。 我試過了:

public class ListComparator implements Comparator<List<Double>> {
    public int compare(List<Double> lhs, List<Double>rhs){
        Double lhs_sum = lhs.stream().mapToDouble(a -> a).sum()/lhs.size();
        Double rhs_sum = rhs.stream().mapToDouble(a -> a).sum()/rhs.size();
        return lhs_sum.compareTo(rhs_sum);
    }
}

然后在 main() 中:

ListComparator listComparator = new ListComparator();
infoMap.entrySet().stream()
                .sorted(Map.Entry.comparingByValue(listComparator))
                .limit(15).forEach(System.out::println);

但這會打印出鍵,並且似乎是一組未排序的不同數量的雙打(應該只有一個雙打)。 我錯過了什么步驟? 謝謝

你只是比較,但我沒有看到你把平均值放在輸出的位置。

嘗試這個:

infoMap.entrySet().stream()
       .map(e -> new SimpleEntry<>(e.getKey(),
                                   e.getValue().stream()
                                    .mapToDouble(d -> d).average()
                                    .orElse(0d)))
       .sorted(Comparator.comparingDouble(Entry::getValue))
       .collect(Collectors.toMap(Entry::getKey, Entry::getValue, 
                                (v1, v2) -> v1, LinkedHashMap::new));

所以你看,第一步是將每個條目轉換為SimpleEntry<String, Double> ,其中 value 是列表的平均值。

第二步是通過Entry::getValue對那些映射的條目進行排序

最后,將它們收集回一個新的Map<String, Double>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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