如何创建可以扩展其值列表的地图。例如,我有一个地图,其中包含:键A和值列表B {1,2,3}。然后在程序运行期间的某个时刻,我想添加更多值,例如:4到列表B.现在我的新地图应该是:(A,{1,2,3,4})。我怎么能这样做?
答案 0 :(得分:9)
由于Map<K,V>
将一个键映射到一个值,因此您需要V
为List<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}...