亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何按嵌套地圖值對外部地圖進行排序

如何按嵌套地圖值對外部地圖進行排序

SMILET 2023-03-02 15:06:41
我遇到了 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());


查看完整回答
反對 回復 2023-03-02
?
牛魔王的故事

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());


查看完整回答
反對 回復 2023-03-02
  • 2 回答
  • 0 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號