2017-05-29 100 views
1

如何创建可以扩展其值列表的地图。例如,我有一个地图,其中包含:键A和值B {1,2,3}的列表。然后在程序运行的某个时刻,我想增加更多的值,例如:4到列表B.现在我的新映射应该是这样的:(A,{1,2,3,4})。我怎样才能做到这一点?如何在java中为单个键添加多个值

+2

'map.get( “A”)添加。 (4);' – QBrute

回答

6

由于Map<K,V>映射一个键一个值,你需要VList<T>类型:

有像他那种类型的
Map<String,List<Integer>> multiMap = new HashMap<>(); 

一个后果是,现在将项目添加到一个关键的过程包括两个步骤:你必须检查是否存在列表为重点,然后再加入新的项目,以现有列表,或添加一个新的列表与单个项目:

List<Integer> current = multiMap.get(key); 
if (current == null) { 
    current = new ArrayList<Integer>(); 
    multiMap.put(key, current); 
} 
current.add(val); 

如果使用Java 8,你可以使用computeIfAbsent来大大简化代码:

multiMap.computeIfAbsent(key, k -> new ArrayList<>()).add(value); 
+4

您可以使用更新的'computeIfAbsent'方法简化实现:'multiMap.computeIfAbsent(key,k - > new ArrayList <>())。add(value);' –

+0

@MalteHartwig Right,Java 8增加了这个方便的选项,大大提高了操作的可读性。谢谢! – dasblinkenlight

+0

@MalteHartwig:哇谢谢!这看起来很棒,而且在Java 8中更专业! – Sonn

2

这种类型的集合已经实现。看看Multimap from Guava。不要从头开始发明自行车。

希望它有帮助!

3

使用新的临时变量添加新的整数, 检查这个解释可能的帮助。

Map<String, List<Integer>> map = new HashMap<String, List<Integer>>(); 
    List<Integer> list = new ArrayList<Integer>(); 
    list.add(1); 
    list.add(2); 
    list.add(3); 

    map.put("A", list); 
    map.forEach((key,value)->System.out.print(key + " : "+ 
    value)); 
    List<Integer> newList = (ArrayList<Integer>)map.get("A"); 
    newList.add(4); 
    System.out.println(); 
    map.put("A", newList); 
    map.forEach((key,value)->System.out.print(key + " : "+ 
      value)); 
0

更通用的解决方案是有一个MultiMap类,其中 提供任何Collection类型作为值,例如, ArrayList: 我几周前在Java-Book中发现了这个。例如:

class MultiMap<K, V> 
{ 
    private final Map<K,Collection<V>> map = new HashMap<>(); 

    public Collection<V> get(K key) 
    { 
    return map.getOrDefault(key, Collections.<V> emptyList()); 
    } 
    public void put(K key,V value) 
    { 
    map.computeIfAbsent(key, k -> new ArrayList<>()).add(value); 
    } 
} 

用途可以是:(映射值是一个字符串的ArrayList)

MultiMap<Integer,String> map = new MultiMap<>(); 
int id = 34; 
System.out.println(map.get(id)); // creates an ArrayList<String> for key 34 

map.put(id,"first value for 34"); 
System.out.println(map.get(id)); // [first value for 34] 

map.put(id,"second"); 
System.out.println(map.get(id)); // [first value for 34, second] 

希望这有助于...

相关问题