Map<String,Integer> map=new HashMap<String,Integer>();
map.put("A",1);
map.put("A",2);
map.put("A",3);
map.put("B",4);
这里我的键是A,它将覆盖A的先前值,并给出键A的值是3。但是我想存储该键的所有值,就像我想存储1,2和3一样。然后请告诉我如何将所有特定键的值存储在arraylist中。
答案 0 :(得分:1)
以这种方式行不通。根据定义,映射键是唯一的。
您将需要一个
Map<String, List<Integer>>
当然,在添加密钥之前,您需要先查找是否已存在条目。如果不是,请使用键添加一个新的Arraylist,并将值添加到新列表中。
答案 1 :(得分:0)
答案 2 :(得分:0)
让我们分析需求
String
的键,它需要映射为一个类型为Integer
的值的集合(唯一)。 (我的假设是唯一的)。我的意思是(xyz),(1)和(xyz,1)在地图中的这两个条目的情况下,它只能被视为一个条目。我们可以提供如下地图。
HashMap <String, Set<Integer>>
尽管可能还会有其他选择,但让我们将其转换为最简单的实现。
private Map<String, Set<Integer>> map = new HashMap<>();
public void putPair( String key, Integer value){
Set<Integer> values = map.get(key);
if(values == null){
values = new HashSet<Integer>();
map.put(key, values);
}
values.add(value);
}
如果还要使用多个相同的值,则可以使用简单的ArrayList代替Set。但是这种情况下更好的方法是将Integer封装在另一个包装器类中并保持计数。如果输入相同,则增加计数。
答案 3 :(得分:0)
答案 4 :(得分:0)
根据您的要求,您不需要Map<String, Integer>
,而是需要Map<String, List<Integer>>
。换句话说,您正在使用 multimap 。
在Java 8+中实现这种数据结构的一种方法是分别使用Map.computeIfAbsent
和Map.computeIfPresent
方法进行插入和删除:
Map<String, List<Integer>> map = new HashMap<>(); // use diamond operator
// INSERT
map.computeIfAbsent("A", k -> new ArrayList<>()).add(1);
map.computeIfAbsent("A", k -> new ArrayList<>()).add(2);
map.computeIfAbsent("A", k -> new ArrayList<>()).add(3);
map.computeIfAbsent("B", k -> new ArrayList<>()).add(4);
// REMOVE
map.computeIfPresent("A", (k, v) -> {
v.remove(1);
return v.isEmpty() ? null : v;
});
map.computeIfPresent("A", (k, v) -> {
v.remove(2);
return v.isEmpty() ? null : v;
});
map.computeIfPresent("A", (k, v) -> {
v.remove(3);
return v.isEmpty() ? null : v;
});
map.computeIfPresent("B", (k, v) -> {
v.remove(4);
return v.isEmpty() ? null : v;
});
编辑:
删除的重映射函数参数可以扩展为以下实用程序方法:
static <K, V> BiFunction<K, List<V>> removing(V elem) {
return (k, v) -> { v.remove(elem); return v.isEmpty() ? null : v; };
}
然后可以按以下方式使用:
map.computeIfPresent("A", removing(1));
map.computeIfPresent("A", removing(2));
map.computeIfPresent("A", removing(3));
map.computeIfPresent("B", removing(4));