存储值而不覆盖

时间:2018-04-30 11:56:11

标签: java hashmap keyvaluepair

我有Map<String, Integer>例如

  1. "aaa", 1
  2. "bbb", 2
  3. "ccc", 3
  4. "aaa", 4
  5. 问题是HashMap没有存储所有的键和值,正如我所理解的,当我尝试添加最后一对("aaa", 4)时,它不会被添加,而不是这样, "aaa"(我的意思是1)的值将在4上被覆盖。

    我知道,我可以创建类,我可以存储这些对,但我需要另一种解决方案。 (没有创建新类)

    EDIT ------------------------------------ 实际上我有更多的对,我没有唯一的字符串或整数,我的意思是,即使我有两个相似的对,他们将被存储

3 个答案:

答案 0 :(得分:0)

创建一个列表:

if (!map.containsKey("aaaa")) {
  map.put("aaaa", new ArrayList<Integer>());
}
List<Integer> aaaaValues = map.get("aaaa");
aaaaValues.add(1);
aaaaValues.add(4);
...

答案 1 :(得分:0)

如果您的值是unieque,请将它们用作键。 您不必创建类。您可以使用List<org.apache.commons.lang3.tuple.Pair<String, Integer>>

也是一种方法,覆盖equals和hashCode,只有当String和Integer参数在pair

中唯一时,该对象才是唯一的
Map<String, Integer> map = new HashMap<String, Integer>(){
            @Override
            public boolean equals(Object o)
            {
                // your realization
            }

            @Override
            public int hashCode()
            {
                // your realization
            }
        };

答案 2 :(得分:0)

根据定义,地图将具有不同的键。如果添加键值对并且该键已存在,则新键值对将覆盖现有键值对。

对于您的方案,当您针对单个键有多个值时,可以浏览以下选项

选项1:由于您的键值对不是唯一的,因此可以将其存储为pairs的列表。对于每个键值对,您可以创建一对并将其插入列表中。

List<Pair<String, Integer>> data = new ArrayList();
Pair<String, Integer> item = new Pair("abc", 1);
data.add(item);

此选项不会为您提供Map附带的优化查找功能。

选项2.创建Map<String, List<Integer>>。您将无法再在地图上执行简单的放置操作,但您将能够存储与每个键对应的所有项目,而不会丢失信息并更快地检索它们。