我有一个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);
但是这会打印出密钥,并出现一个未排序的数目可变的双精度数组(应为一个双精度数组)。我想走哪一步? 谢谢
答案 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>