[英]How to add a value to a list of values for a single key in a hashmap (Java)
我写了这个:
HashMap<String, String> map1 = new HashMap<String, String>();
Map<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>();
我试图为哈希图中的每个键允许大于1的值。 因此,如果第一个键是“ 1”,我想允许将“ 1”与值“ 2”和“ 3”配对。
就像这样:
1 --> 2
|--> 3
但是当我这样做时:
map2.put(key, value);
它给出了表示“不兼容类型”的错误,并且无法将其转换为ArrayList,并且表示错误在行的value
部分。
如果您使用的是Java 8,则可以轻松完成此操作:
String key = "someKey";
String value1 = "someValue1";
String value2 = "someValue2";
Map<String, List<String>> map2 = new HashMap<>();
map2.computeIfAbsent(key, k -> new ArrayList<>()).add(value1);
map2.computeIfAbsent(key, k -> new ArrayList<>()).add(value2);
System.out.println(map2);
Map.computeIfAbsent(...)
的文档中有很多此示例。
在map2
您仅需要添加ArrayList
(您将其声明为Map<String, ArrayList<String>>
-第二个是值类型),这就是为什么它为您提供了不兼容的类型 。
您需要使用ArrayList
初始化键,并在以后向其添加对象:
if (!map2.containsKey(key)) {
map2.put(key, new ArrayList<String>());
}
map2.get(key).add(value);
或者,您可以使用番石榴中的Multimap
,然后可以只map2.put
,它不会覆盖那里的值,而是添加到列表中。
这是因为Java中的标准Map实现仅存储一对(oneKey,oneValue)。 在Java标准Map中存储特定键的多个值的唯一方法是将“集合”存储为值,然后您需要通过键访问此集合(从Map),然后将该集合“值”用作常规集合,在您的示例中为ArrayList。 因此,您不必直接通过map.put放置某些内容(创建空集合除外),而是可以通过键获取整个集合并使用此集合。
您需要像Multimap这样的东西,例如:
public class Multimap<T,S> {
Map<T, ArrayList<S>> map2 = new HashMap<T, ArrayList<S>>();
public void add(T key, S value) {
ArrayList<T> currentValuesForGivenKey = get(key);
if (currentValuesForGivenKey == null) {
currentValuesForGivenKey = new ArrayList<T>();
map2.get(key, currentValuesForGivenKey);
}
currentValuesForGivenKey.add(value);
}
public ArrayList<S> get(T key) {
ArrayList<String> currentValuesForGivenKey = map2.get(key);
if (currentValuesForGivenKey == null) {
currentValuesForGivenKey = new ArrayList<S>();
map2.get(key, currentValuesForGivenKey);
}
return currentValuesForGivenKey;
}
}
那么您可以像这样使用它:
Multimap<String,String> map2 = new Multimap<String,String>();
map2.add("1","2");
map2.add("1","3");
map2.add("1","4");
for (String value: map2.get("1")) {
System.out.println(value);
}
将打印:
2
3
4
您与您要做的事情有点距离。
Map<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>();
这将仅允许将String作为键,将ArrayList作为值。 因此,您必须尝试以下操作:
ArrayList<String> value=new ArrayList<String>();
value.add("2");
value.add("3");
map2.put("1", value);
检索时,您还必须遵循相反的步骤。
ArrayList<String> valueTemp=map2.get("1");
然后您可以遍历此ArrayList以获得那些值(“ 2”和“ 3”);
尝试这样。 //使用列表或set ..但set避免重复
Map<String, Set<String>> map = new HashMap<>();
Set<String> list = new HashSet<>();
// add value to the map
Boolean b = map.containsKey(key);
if (b) {
map.get(key).addAll(list);
} else
map.put(key, list);
}
您不能在地图的同一键中添加不同的值。 Map会覆盖该键中的值。 您可以这样操作。
Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
ArrayList<String> list=new ArrayList<String>();
list.add("2");
list.add("3");
map.put("1", list);
首先在数组列表中添加值,然后放入map中。
它给出了表示“不兼容类型”的错误,并且无法将其转换为ArrayList,并且表示错误在行的值部分。
因为,它不会自动转换为ArrayList
。
您应该将两个值都添加到列表中,然后将该列表放入地图中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.