【问题标题】:Store the values without overwriting存储值而不覆盖
【发布时间】:2018-04-30 20:30:24
【问题描述】:

我有一个Map<String, Integer>,例如

  1. "aaa", 1
  2. "bbb", 2
  3. "ccc", 3
  4. "aaa", 4

问题是HashMap 不存储所有键和值,据我所知,当我尝试添加最后一对("aaa", 4) 时,它不会被添加,而是@ 的值987654328@(我的意思是 1)将在 4 被覆盖。

我知道,我可以创建类,我可以在其中存储这些对,但我需要另一个解决方案。 (不创建新类)

编辑 ---------------------------------- 实际上我有更多对,而且我没有唯一的字符串或整数,我的意思是,即使我有两个相似的对,它们也会被存储

【问题讨论】:

  • 看看MultiMap
  • 为什么不使用 Map> ?还是 Apache Commons / Guava MultiMap?
  • 如果Integer是唯一的,可以使用<Integer, String>
  • 也可以使用 List>
  • 我希望有一天我们在 java 核心集合中拥有多地图。

标签: java hashmap keyvaluepair


【解决方案1】:

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

对于您的场景,当您对单个键有多个值时,您可以探索以下选项

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

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

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

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

【讨论】:

    【解决方案2】:

    创建一个列表:

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

    【讨论】:

      【解决方案3】:

      如果您的值是唯一的,请将它们用作键。 您不必创建课程。你可以使用List&lt;org.apache.commons.lang3.tuple.Pair&lt;String, Integer&gt;&gt;

      还有一种方法,只有当 String 和 Integer 参数在成对中唯一时,才覆盖你所说的对象唯一的 equals 和 hashCode

      Map<String, Integer> map = new HashMap<String, Integer>(){
                  @Override
                  public boolean equals(Object o)
                  {
                      // your realization
                  }
      
                  @Override
                  public int hashCode()
                  {
                      // your realization
                  }
              };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多