如何按嵌套地图值对外部地图进行排序

我遇到了 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>>)


SMILET
浏览 98回答 2
2回答

隔江千里

您不能comparingByValue在这种情况下使用,因为您不想按内部地图的各个条目进行排序。你能做的最好的事情是:List<Entry<String,&nbsp;Map<String,&nbsp;Long>>>&nbsp;result&nbsp;=&nbsp;queryResult.entrySet() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sorted(Comparator.comparing(Entry<String,&nbsp;Map<String,&nbsp;Long>>::getKey) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.thenComparingLong(e&nbsp;->&nbsp;e.getValue() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.values() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mapToLong(i&nbsp;->&nbsp;i) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sum())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());或者List<Entry<String,&nbsp;Map<String,&nbsp;Long>>>&nbsp;result2&nbsp;=&nbsp;queryResult.entrySet() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sorted(Entry.<String,&nbsp;Map<String,&nbsp;Long>>comparingByKey() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.thenComparingLong(e&nbsp;->&nbsp;e.getValue() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.values() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mapToLong(i&nbsp;->&nbsp;i) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sum())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());

牛魔王的故事

这应该有效:final&nbsp;Map<String,&nbsp;Map<String,&nbsp;Long>>&nbsp;map&nbsp;=&nbsp;new&nbsp;HashMap<>();final&nbsp;List<Entry<String,&nbsp;Map<String,&nbsp;Long>>>&nbsp;sorted&nbsp;=&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;map.entrySet().stream().sorted((a,&nbsp;&nbsp;b)&nbsp;->&nbsp;Long.compare( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.getValue().values().stream().mapToLong(l&nbsp;->&nbsp;l).sum(), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.getValue().values().stream().mapToLong(l&nbsp;->&nbsp;l).sum())) &nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java