![](/img/trans.png)
[英]Java: How to properly remove a value from a HashMap NOT based on the key
[英]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.