簡體   English   中英

根據 Java 中的鍵屬性從 hashmap 中刪除 object

[英]Remove object from hashmap based on key attribute in Java

我有一個Identifier class,如下所示:

private final Integer year;
private final Integer month;

...

@Override
public boolean equals(Object o) {
    ...
}

@Override
public int hashCode() {
    ...
}

我想使用這個 class 作為ConcurrentHashMap中的鍵。

類似ConcurrentHashMap<Identifier, Object>

對象始終按年和月標識,這意味着此 class 可用於查找 object 並仍使用 hashmap 的並發屬性。

現在,在某些情況下,我想刪除與某個特定年份相關的所有對象。 有沒有辦法輕松做到這一點?

還是我應該只創建一個雙ConcurrentHashMap ConcurrentHashMap<Integer, ConcurrentHashMap<Integer, Object>>

我不確定它是否會是同樣的事情。 如果出於某種原因我想按月刪除它是行不通的。

如果您使用ConcurrentHashMap<Identifier, Object> ,則必須迭代 map 的所有條目並刪除所需的對象。

無法覆蓋equals & hashCode來實現您想要的。

如果您覆蓋上述方法以將相同年份的 2 個對象視為相等,您將無法在 map 中存儲多個具有相同年份和不同月份的對象,因為這樣做將替換舊的 object,因為它們都是平等的。


但是,此設置ConcurrentHashMap<Integer, ConcurrentHashMap<Integer, Object>>可以為您工作。

我認為使用等於,哈希碼是不可能做到這一點的,因為您已經使用年和月在標識符 class 中定義了它們,因此您不能僅使用年字段來更改它們,因為它會覆蓋 map 中的元素,即使月份不同。

public class Application {
public static void main(String[] args) {
    ConcurrentHashMap<Identifier, String> map = new ConcurrentHashMap<>();
    map.put(new Identifier(2020,1), "1");
    map.put(new Identifier(2020,2), "2");
    map.put(new Identifier(2021,3), "3");
    map.put(new Identifier(2021,4), "4");
    map.put(new Identifier(2021,1), "5");

    System.out.println(map.size()); // 5
    removeElementsByYear(map, 2020);
    System.out.println(map.size()); // 3
}

private static void removeElementsByYear(ConcurrentHashMap<Identifier, String> map, int year) {
    for(Identifier key : map.keySet()) {
        if (key.getYear() == year) {
            map.remove(key);
        }
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM