如何在java中为单个键添加多个值

时间:2017-05-29 11:50:51

标签: java

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

6 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

此类收集已经实施。看看Multimap from Guava。不要从头开始发明自行车。

希望它有所帮助!

答案 2 :(得分:3)

使用新的temp变量添加新的Integer, 检查这个解释可能会有所帮助。

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

答案 3 :(得分:0)

更通用的解决方案是拥有一个MultiMap类 提供任何Collection类型作为值,例如数组列表: 我在几周前的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]

希望这会有所帮助......

答案 4 :(得分:0)

 public static void main(String[] args) {

Map<String, List<String>> map = new HashMap<String, List<String>>();

List<String> valSetOne = new ArrayList<String>();
valSetOne.add("ABC");
valSetOne.add("BCD");
valSetOne.add("DEF");

List<String> valSetTwo = new ArrayList<String>();
valSetTwo.add("CBA");
valSetTwo.add("DCB");

map.put("FirstKey", valSetOne);
map.put("SecondKey", valSetTwo);

for (Map.Entry<String, List<String>> entry : map.entrySet()) {

    String key = entry.getKey();

    List<String> values = entry.getValue();

    System.out.println("Value of " + key + " is " + values);

}

}

您可以根据需要使用Set或List。这是具有多个值的单个键的简单方法。

答案 5 :(得分:0)

  

Java 8. Stream API。

例如,我们有“用户”作为列表的集合:

[{ name: "qwer", surname: "asdf", type: "premium"}, { name: "ioup", surname: "vmnv", type: "usual"}, { name: "rtyr", surname: "zxc", type: "premium"}] 

,我们需要将多个用户添加到Map,其中键为“类型”

Map<String, List<User>> map = collection.stream().collect(Collectors.groupingBy(User::getType, Collectors.mapping(Function.identity(), Collectors.toList())))

要处理此地图,我们可以创建新的流

map.entrySet().stream().{map|reduce|& other things}...