2016-08-24 107 views
0

喜,所以我写了这个:如何将值一个HashMap中添加值的列表单个键(JAVA)

HashMap<String, String> map1 = new HashMap<String, String>(); 
Map<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>(); 

我试图允许在每个键多于1个值一个hashmap。所以如果第一个键是'1',我想让'1'与值'2'和'3'配对。

所以它是这样的:

1 --> 2 
|--> 3 

但是当我做:

map2.put(key, value); 

提示错误,说:“不兼容的类型”,并不能转换为ArrayList和它说的错误位于该行的value部分。

thenk你多少

+1

地图列表是好的事情,但它不清楚你想要做什么 – AndreyS

回答

1

如果您使用的是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); 

documentation对于Map.computeIfAbsent(...)几乎没有这个例子。

+0

谢谢你!但是有没有办法用'computeIfAbsent'完成这个工作? – barneesh

+0

'k - >'不清楚。它是什么?对不起,无法从文档链接中获取它。 –

+0

@barneesh,如果你不使用Java 8,下面的krzyk的答案是一个很好的解决方案。 – msandiford

0

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,它不会覆盖你的价值观在那里,但添加到列表。

-1

它给出错误,说“不兼容的类型”,它不能转换为ArrayList,它说错误是在行的值部分。

因为它不会自动转换为ArrayList

您应该将这两个值添加到列表中,然后将该列表放在地图中。

+0

谁投了票,在这里发表评论。 – Azodious

0

这完全是因为java中的标准Map实现只存储单对(oneKey,oneValue)。在Java标准Map中为特定键存储多个值的唯一方法是将“collection”存储为值,然后您需要通过键访问该集合(从Map),然后使用该集合“value”作为常规集合,在你的例子中作为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 
0

你有点远离你想要做的事情。

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); 

当检索你还必须按照ans相反的程序。然后你可以迭代这个ArrayList来获得这些值(“2”和“3”);然后你可以迭代这个ArrayList来获得这些值(“2”和“3”)。

0

试试这个。 //使用列表或设置..但设置避免重复

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); 
      } 
0

您无法在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); 

首先在数组列表中添加数值然后放入地图。

相关问题