【问题标题】:How to have a key with multiple values in a map?如何在地图中拥有具有多个值的键?
【发布时间】:2012-12-05 09:44:02
【问题描述】:

我有一张这样的地图

Map map=new HashMap();//HashMap key random order.
map.put("a",10);
map.put("a",20);
map.put("a",30);
map.put("b",10);

System.out.println("There are "+map.size()+" elements in the map.");
System.out.println("Content of Map are...");
Set s=map.entrySet();
Iterator itr=s.iterator();
while(itr.hasNext())
{
    Map.Entry m=(Map.Entry)itr.next();
    System.out.println(m.getKey()+"\t"+m.getValue()+"\t"+ m.hashCode());
}

上述程序的输出是

There are 2 elements in the map.
Content of Map are...
b   10  104
a   30  127

现在我希望键 a 应该有多个值,例如

a 10
a 20
a 30

这样我就应该得到与 a 关联的所有值。请告知我怎样才能实现同样的目标。通过嵌套集合,我希望键 'a' 具有所有三个值。

【问题讨论】:

    标签: java map


    【解决方案1】:

    您查看Guava Multimaps 了吗?

    类似于 Map 的集合,但可能关联多个值 用一把钥匙。如果你调用 put(K, V) 两次,使用相同的键但是 不同的值,多​​重映射包含从键到两者的映射 价值观。

    如果您真的想使用标准集合(如下所示),您必须为每个键存储一个集合,例如

    map = new HashMap<String, Collection<Integer>>();
    

    请注意,第一次输入新密钥时,您必须在添加第一个值之前创建新集合(ListSet 等)。

    【讨论】:

    • 我在看java本身 请在java中指教
    • Guava 是一个广泛使用的 Java 库。但是请注意我上面的评论。地图中的集合
    【解决方案2】:

    要使用 Java 标准库实现您想要的,我会使用这样的映射:

    Map<String, Collection<Integer>> multiValueMap = new HashMap<String, Collection<Integer>>();
    

    然后你可以添加值:

    multiValueMap.put("a", new ArrayList<Integer>());
    multiValueMap.get("a").add(new Integer(10));
    multiValueMap.get("a").add(new Integer(20));
    multiValueMap.get("a").add(new Integer(30));
    

    如果这让您感到不舒服,请考虑将此行为封装在专用类中,或使用第三方解决方案,正如其他人在此处建议的那样 (Guava Multimap)。

    【讨论】:

    • 嗨 think01 在添加一些与投射相关的内容时会引发编译时间错误,请告知
    • 我忘记了通用地图声明,现在它是正确的。让我们试着告诉我。
    • 是的,非常感谢!!但是我没有其他方法可以避免数组列表..!!
    • 对于标准 Java 库,我想不出开箱即用的解决方案,您应该使用第三方库。无论如何,如果您解决了最初的问题,请考虑选择您的最佳答案。
    【解决方案3】:

    您不应忽略泛型参数。你所拥有的是

    Map<String, Integer> map = new HashMap<>();
    

    如果你想自己编写解决方案,你需要

    Map<String, List<Integer>> map = new HashMap<>();
    

    无论如何,首选方法是使用Guava Multimap

    【讨论】:

      【解决方案4】:

      在值部分放置一个ArrayList 实例。

      void addValue(Map map, Object key, Object value) {
          Object obj = map.get(key);
          List list;
          if (obj == null) {  
              list = new ArrayList<Object>();  
          } else {
              list = ((ArrayList) obj);
          }
          list.add(value);
          map.put(key, list);
      }
      

      更多信息请查看this

      【讨论】:

      • Hi D3EP4K 请贴出代码,让理解更清晰
      • 将此函数放入您的代码中并调用 addValue(map,new String("a"),new Integer(10)) 而不是调用 map.put("a",10)
      • 根据问题中提到的方法,新值替换旧值。
      【解决方案5】:

      使用具有值类型的 Map 作为值列表。例如,在您的地图中,添加条目时,您会将键作为“a”,并且您必须将其值添加为 Integer 列表,具有所有所需的值,例如 1,2,3,4。

      【讨论】:

        【解决方案6】:

        对于具有相同键条目的 Map,使用 get() 毫无意义。但只要您使用 iterator()entrySet() 这应该可以:

        class HashMap<String, String> {
        
          Set<Entry<String, String>> entries;
          @Override
          public Set<Entry<String, String>> entrySet() {
            return entries;
          }
        
          @Override
          public int size() {
            return entries.size();
          }
        
          public String put(String key, String value) {
            if (entries == null) {
              entries = new AbstractSet<Entry<String, String>>() {
        
                ArrayList<Entry<String, String>> list = new ArrayList<>();
                @Override
                public Iterator<Entry<String, String>> iterator() {
                  return list.iterator();
                }
        
                @Override
                public int size() {
                  return list.size();
                }
        
                @Override
                public boolean add(Entry<String, String> stringStringEntry) {
                  return list.add(stringStringEntry);
                }
              };
            }
            StatusHandler.MyEntry entry = new StatusHandler.MyEntry();
            entry.setKey(key);
            entry.setValue(value);
            entries.add(entry);
            return value;
          }
        };
        

        TL;DR 那么,它有什么用呢?这来自对 redmine-java-api 的破解,以接受基于表单参数的复杂查询:

        https://stackoverflow.com/a/18358659/848072

        https://github.com/albfan/RedmineJavaCLI/commit/2bc51901f2f8252525a2d2258593082979ba7122

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-29
          • 1970-01-01
          • 2012-05-27
          • 1970-01-01
          相关资源
          最近更新 更多