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

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

刪除 Map<Long, List<Object>> 的條目

刪除 Map<Long, List<Object>> 的條目

青春有我 2023-06-14 13:58:48
經過數小時的研究,我找不到問題的解決方案。我有一個Map<String, List<User>>,我想根據列表中的某些值刪除地圖的某些項目。我必須關注用戶類public class User {    public String firstName,    public Integer age    public boolean is50() {       return this.age.equals(50);    }}我有一個這樣的地圖:Map<String, List<User> myMap = new HashMap<>();myMap.put("A", new ArrayList<>());myMap.get("A").add(new User("John", 50));myMap.get("A").add(new User("Bob", 30));myMap.put("B", new ArrayList<>());myMap.get("B").add(new User("Sam", 25));myMap.get("B").add(new User("Sarah", 56));myMap.put("C", new ArrayList<>());myMap.get("C").add(new User("Gill", 15));myMap.get("C").add(new User("Jim", 20));現在,如果列表中至少有一個用戶年齡為 50 歲,我想刪除 Map 的條目。另外,我想使用 Java 8 功能來實現這一點。我發現有一個removeIf函數,但我不能讓它與列表一起使用。我試過這樣的事情:Map<String, List<User> filteredMap = myMap                                 .enrySet()                                 .removeIf(e -> e.getValue()                                        .stream()                                        .filter(user -> user::is50)                                        .collect(Collectors.toList())當然那是行不通的:(例外的輸出是一個 filteredMap,所有用戶只有 B 和 C 鍵(必須刪除 A 鍵,因為 John 已經 50 歲了)謝謝你的幫助,希望它是清楚的;)
查看完整描述

4 回答

?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

這應該可以解決問題:

myMap.entrySet()
????.removeIf(e?->?e.getValue()
????????.stream()
????????.anyMatch(User::is50));

請注意,entrySet() 修改 (removeIf) 會影響條目集支持的映射。因此,您要么必須制作地圖的副本并在副本上運行它,要么讓第一個地圖 (?myMap) 被修改。

至于制作地圖副本,您可以簡單地執行以下操作:

Map<String,?List<User>>?copy?=?new?HashMap<>(myMap);

就地刪除的更好方法如下:

myMap.values()
????.removeIf(v?->?v.stream()
????????.anyMatch(User::is50));

這更好的原因有四個:

  1. getValue您可以取消對since 的調用,因為values它直接提供了值集。

  2. values它更清楚地傳達意圖 -與價值之間的邏輯跳躍比entrySet與價值之間的邏輯跳躍更少。

  3. 它更簡潔并且不是反模式(例如,使用peekoutside of debugging 是一種反模式,盡管有時更簡潔)。

  4. 它仍然有效,因為返回的 Collection由 mapvalues支持。


查看完整回答
反對 回復 2023-06-14
?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

只需用于Stream::noneMatch您的嵌套 Stream :


Map<String,?List<User>>?filteredMap?=?myMap.entrySet()
????????????????.stream()
????????????????.filter(e?->?e.getValue()
????????????????????????.stream()
????????????????????????.noneMatch(User::is50)
????????????????)
????????????????.collect(Collectors.toMap(Map.Entry::getKey,?Map.Entry::getValue));

filteredMap.forEach((key,?value)?->?System.out.println(key));

輸出是:

B
C

在此解決方案myMap中將不受影響,因為我stream用完了entrySet然后收集了它。Set::removeIf會改變你以前的地圖,因為支持你原來的條目的Map::entrySet返回。SetMap


查看完整回答
反對 回復 2023-06-14
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

如您所見,您必須對 EntrySet 進行操作。您可以將其轉換為流并收集回新地圖,如下所示:

myMap.entrySet().stream()
             .filter(e -> e.getValue().stream().noneMatch(User::is50))
             .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))


查看完整回答
反對 回復 2023-06-14
?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

您可以使用 Map EntrySet 來解析您的地圖,然后解析每個條目中的列表


for (Map.Entry<String, List<User> entry : myMap.entrySet())

{

    boolean toDelete = false;

    for (User user : entry.getValue())

    {

        if (user.age == 50)

            toDelete = true;

    }

    if (toDelete)

        myMap.remove(entry.getKey());

}


查看完整回答
反對 回復 2023-06-14
  • 4 回答
  • 0 關注
  • 207 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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