我遇到了 Java 8 排序方法的问题。我得到以下结构:Map<String, Map<String, Long>>我想要实现的是首先按外部地图的键(强制顺序)对外部地图进行排序,然后按内部地图值的总和(Longs)排序,然后以正确的顺序将其放入 Map.Entry 列表中。我设法用第一个条件对它进行排序,但我无法让它在第二个条件下工作(thenComparing 方法)——存在类型错误。queryResult.allCountersArray = queryResult.allCounters.entrySet().stream() .sorted(Map.Entry.<String, Map<String, Long>>comparingByKey(Comparator.comparing(term -> term.getSortingKey())) .thenComparing(Map.Entry.<String, Map<String, Long>>comparingByValue(Map.Entry.<String, Long>comparingByValue())) ) .collect(Collectors.toList());Error:(87, 49) java: no suitable method found for comparingByValue(java.util.Comparator<java.util.Map.Entry<java.lang.String,java.lang.Long>>) method java.util.Map.Entry.<K,V>comparingByValue() is not applicable (explicit type argument java.util.Map<java.lang.String,java.lang.Long> does not conform to declared bound(s) java.lang.Comparable<? super java.util.Map<java.lang.String,java.lang.Long>>) method java.util.Map.Entry.<K,V>comparingByValue(java.util.Comparator<? super V>) is not applicable (argument mismatch; java.util.Comparator<java.util.Map.Entry<java.lang.String,java.lang.Long>> cannot be converted to java.util.Comparator<? super java.util.Map<java.lang.String,java.lang.Long>>)
2 回答
隔江千里
TA贡献1906条经验 获得超10个赞
您不能comparingByValue
在这种情况下使用,因为您不想按内部地图的各个条目进行排序。
你能做的最好的事情是:
List<Entry<String, Map<String, Long>>> result = queryResult.entrySet() .stream() .sorted(Comparator.comparing(Entry<String, Map<String, Long>>::getKey) .thenComparingLong(e -> e.getValue() .values() .stream() .mapToLong(i -> i) .sum())) .collect(Collectors.toList());
或者
List<Entry<String, Map<String, Long>>> result2 = queryResult.entrySet() .stream() .sorted(Entry.<String, Map<String, Long>>comparingByKey() .thenComparingLong(e -> e.getValue() .values() .stream() .mapToLong(i -> i) .sum())) .collect(Collectors.toList());
牛魔王的故事
TA贡献1830条经验 获得超3个赞
这应该有效:
final Map<String, Map<String, Long>> map = new HashMap<>();final List<Entry<String, Map<String, Long>>> sorted = map.entrySet().stream().sorted((a, b) -> Long.compare( a.getValue().values().stream().mapToLong(l -> l).sum(), b.getValue().values().stream().mapToLong(l -> l).sum())) .collect(Collectors.toList());
添加回答
举报
0/150
提交
取消