将重复键的所有值存储在映射中

时间:2019-04-04 07:14:00

标签: java dictionary hashmap

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中。

5 个答案:

答案 0 :(得分:1)

以这种方式行不通。根据定义,映射键是唯一的。 您将需要一个 Map<String, List<Integer>> 当然,在添加密钥之前,您需要先查找是否已存在条目。如果不是,请使用键添加一个新的Arraylist,并将值添加到新列表中。

答案 1 :(得分:0)

或者更成熟的替代方案可以是番石榴的multiMap

您可以找到有关其用法的引用here

希望有帮助!

答案 2 :(得分:0)

让我们分析需求

  1. 您有一个类型为String的键,它需要映射为一个类型为Integer的值的集合(唯一)。 (我的假设是唯一的)。我的意思是(xyz),(1)和(xyz,1)在地图中的这两个条目的情况下,它只能被视为一个条目。
  2. 从第1点开始,我们可以为条目定义一个结构:[键字符串,值集]
  3. 需要一个映射来保存第2点中提到的类型的条目。

我们可以提供如下地图。

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)

尝试一下,希望对您有所帮助。

b

enter image description here

答案 4 :(得分:0)

根据您的要求,您不需要Map<String, Integer>,而是需要Map<String, List<Integer>>。换句话说,您正在使用 multimap

在Java 8+中实现这种数据结构的一种方法是分别使用Map.computeIfAbsentMap.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));