将地图密钥从集合转换为双精度-Java

时间:2018-08-19 17:04:17

标签: java hashmap

我有一个Map<String, List<Double>>,从中我想得到一个排序的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);

但是这会打印出密钥,并出现一个未排序的数目可变的双精度数组(应为一个双精度数组)。我想走哪一步? 谢谢

1 个答案:

答案 0 :(得分:2)

您只能进行比较,但看不到将平均值放在输出中的位置。

尝试一下:

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>,其中值是列表的平均值。

第二步是按Entry::getValue

对那些映射的条目进行排序

然后,最后将它们收集回新的Map<String, Double>