gpt4 book ai didi

java - 带有列表和 putIfAbsent 的通用 HashMap

转载 作者:行者123 更新时间:2023-11-30 08:23:36 25 4
gpt4 key购买 nike

在 Java 中,我想向常规映射添加一个 getOrAdd 方法,就像在 ConcurrentHashMap 上添加 putIfAbsent 一样。

此外,对于某个键,我想存储一个项目列表。这是我的尝试:

public class ListMap<K, V> extends HashMap<K, V> {

private HashMap<K, List<V>> map;

public ListMap() {
map = new HashMap<K, List<V>>();
}

public List<V> getOrAdd(K key) {
if (map.containsKey(key)) {
return map.get(key);
} else {
List<V> l = new ArrayList<V>();
map.put(key, l);
return l;
}
}
}

但是,如果有人想要遍历 ListMap,他将需要显式转换值。

ListMap<Integer, MyClass> listMap = new ListMap<Integer, MyClass>();
for (Map.Entry<Integer, MyClass> entry : listMap.entrySet()) {
List<MyClass> val = (List<MyClass>) entry.getValue();
}
  1. 有没有办法在不创建子类的情况下通过一些方法扩展 HashMap 类? (我在 C# 中看到过这个)

  2. 如何修改 ListMap 类,以便无需强制转换即可获取 ListMaps 的值 (List)?

最佳答案

你的类的实例也将是 HashMap 所以你不需要,甚至不应该添加另一个字段来支持 getOrAdd 方法,因为其他继承和未覆盖的方法将不会被引用到 map 字段,但到 this 实例。

所以不是添加单独的字段

private HashMap<K, List<V>> map;

ListMap 的扩展类型更改为

public class ListMap<K, V> extends HashMap<K, List<V>> 
^^^^^^^

并将您的 getOrAdd 方法更改为不使用 map 字段,而是使用 this

public List<V> getOrAdd(K key) {
if (containsKey(key)) {
return get(key);
} else {
List<V> l = new ArrayList<V>();
put(key, l);
return l;
}
}

此更改将使您可以像这样使用 map

ListMap<Integer, String> listMap = new ListMap<Integer, String>();
for (Map.Entry<Integer, List<String>> entry : listMap.entrySet()) {
List<String> val = entry.getValue();//NO CASTING NEEDED
}

关于java - 带有列表和 putIfAbsent 的通用 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23546426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com