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

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

從Map中提取沒有重復值的鍵

從Map中提取沒有重復值的鍵

12345678_0001 2023-07-13 14:31:56
地圖定義為: Map<Integer,String> map = new HashMap<>();        map.put(2,"ram");        map.put(3,"ram");        map.put(4,"gopal");        map.put(5,"madan");        map.put(6,"shyam");        map.put(7,"gopal");        map.put(8,"ram");我的預期輸出是列表,其中僅包含沒有重復值的鍵。56我的方法和思考過程:思考過程1:我將采取map.entrySet().stream().map(....)然后采取映射內的另一個流并過濾存在重復值的值。該方法很快就被浪費了,因為第一個索引值將在嵌套流中再次進行比較,并且我會碰巧過濾掉所有元素。思維過程2我通過以下List方式保持不同的值:List<String> subList = map.entrySet().stream()        .map((k)->k.getValue())        .collect(Collectors.toList());進而:    map.entrySet().stream()            .filter(s ->                subList.contains(s.getValue())                )            .map(Map.Entry::getKey)            .collect(Collectors.toList());但我得到的輸出為2345678輸出是顯而易見的,因為我從流中選取的值是我在池中比較它的值,其中該值將始終至少出現一次。我再次想到,如果我可以有一個計數器來計數,并且如果該值存在,那么它就會增加,但現在一切似乎都非常模糊。我可以使用流通過索引進行迭代的任何方式,以便我始終可以保留我正在獲取的鍵值并僅與其余值進行比較。希望得到簡短的解釋。
查看完整描述

2 回答

?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

您可以將任務分為兩步。首先計算收集器重復的groupingBy()counting()。

Map<String,Long> valueCount = map.values()
           .stream()
           .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));

其結果是:

{馬丹=1,希亞姆=1,戈帕爾=2,拉姆=3}

第二步是僅查找其值不重復的鍵。因此,為了實現這一點,您可以使用filter()并按上一步結果過濾地圖。

map.entrySet()
   .stream()
   .filter(entry -> valueCount.get(entry.getValue())==1).map(Map.Entry::getKey)
   .collect(Collectors.toList())


查看完整回答
反對 回復 2023-07-13
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

1您可以在創建時按頻率過濾值,subList例如:

Set<String> uniqueSet = map.values().stream()
        .collect(Collectors.groupingBy(a -> a, Collectors.counting()))
        .entrySet().stream()
        .filter(a -> a.getValue() == 1)
        .map((Map.Entry::getKey))
        .collect(Collectors.toSet());

然后執行與以下相同的操作:

Set<Integer> result = map.entrySet().stream()
        .filter(e -> uniqueSet.contains(e.getValue()))
        .map(Map.Entry::getKey)
        .collect(Collectors.toSet());

或者正如 Holger 在評論中指出的那樣,counting您可以取消一個Boolean值來過濾唯一值,而不是 :

Set<String> uniqueSet = map.values().stream()
        .collect(Collectors.toMap(Function.identity(), v -> true, (a,b) -> false))
        .entrySet().stream()
        .filter(Map.Entry::getValue)
        .map((Map.Entry::getKey))
        .collect(Collectors.toSet());


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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