【问题标题】:How to fill a hashmap with an arraylist?如何用数组列表填充哈希图?
【发布时间】:2019-01-07 13:21:07
【问题描述】:

它有点不言自明,但我该如何填写呢?

Map<Integer,ArrayList<Integer>>intMap = new HashMap<Integer, ArrayList<Integer>>();

我已经试过了

intMap.put(1, 2);
intMap.put(1, 3); etc

intMap.put(1, (2, 3);

【问题讨论】:

    标签: java arraylist hashmap


    【解决方案1】:

    你应该使用Map.computeIfAbsent:

    intMap.computeIfAbsent(someKey, k -> new ArrayList<>()).add(someValue);
    

    例如,要有这些映射:

    1 -> [2, 3]
    5 -> [8]
    6 -> [7, 9, 4]
    

    你可以这样做:

    intMap.computeIfAbsent(1, k -> new ArrayList<>()).add(2);
    intMap.computeIfAbsent(1, k -> new ArrayList<>()).add(3);
    
    intMap.computeIfAbsent(5, k -> new ArrayList<>()).add(8);
    
    intMap.computeIfAbsent(6, k -> new ArrayList<>()).add(7);
    intMap.computeIfAbsent(6, k -> new ArrayList<>()).add(9);
    intMap.computeIfAbsent(6, k -> new ArrayList<>()).add(4);
    

    编辑:

    Map.computeIfAbsent 等价于这段代码:

    List<Integer> list = intMap.get(someKey);
    if (list == null) {
        list = new ArrayList<>();
        intMap.put(someKey, list);
    }
    list.add(someValue);
    

    【讨论】:

      【解决方案2】:
      List<Integer> list = new ArrayList<Integer>();
      list.add(1);
      list.add(2);
      list.add(3);
      intMap.put(1, list);
      
      list = new ArrayList<>();
      list.add(4);
      list.add(5);
      list.add(6);
      intMap.put(2, list);
      

      【讨论】:

        【解决方案3】:

        如果地图和列表在实例化后不可修改,则可以使用 Java 9:

        Map<Integer, List<Integer>> map = Map.of(1, List.of(2, 3), 
                                                 2, List.of(3, 5));
        

        如果地图和列表是可修改的,您可以遵循 Federico Peralta Schaffner 的方法,并通过使用 var-args 提取方法使其更加用户友好:

        void fill(Map<Integer, List<Integer>> map, Integer key, Integer... values) {
            map.computeIfAbsent(key, k -> new ArrayList<>())
               .addAll(Arrays.asList(values));
        }
        

        您现在可以轻松使用它:

        Map<Integer, List<Integer>> map = new HashMap<>();
        fill(map, 1, 2, 3);
        fill(map, 2, 4, 6);
        fill(map, 2, 1);
        

        请注意,在 var-args 中传递 null 引用将触发 Arrays.asList(values) 中的 NullPointerException

        【讨论】:

          【解决方案4】:

          首先,不要映射到 ArrayList。使用列表时,不要提及比列表更具体的内容,除非在您构建它的地方。您的地图没有理由不接受不同类型的列表。 (另外,如果顺序无关紧要,它应该只是一个集合,而不是一个列表。声明的东西尽可能不具体。)

          上面关于使用 computeIfAbsent 的帖子是您使用地图时的正确答案。如果你只是想用几个值初始化地图,你可以这样做。

          map.put(1, new ArrayList<>(Arrays.asList(2,3)));
          map.put(2, new ArrayList<>(Arrays.asList(7, 9, 11)));
          

          (根据下面的优秀评论更正。)

          【讨论】:

          • 谨慎使用这种方法。 Arrays.asList 不允许稍后将元素添加到列表中。也许你可以使用new ArrayList&lt;&gt;(Arrays.asList(...))。同意所有其他 cmets +1
          【解决方案5】:

          简单,您可以尝试多种方式,例如,

          Map<Integer,ArrayList<Integer>>intMap = new HashMap<Integer, ArrayList<Integer>>();
          
          intMap.put(101,new ArrayList<Integer>().add(1));
          intMap.put(102,new ArrayList<Integer>().add(2));
          

          我猜如果每个索引有多个值,那么只有你在尝试这样做,在这种情况下我们可以这样做,

          ArrayList<Integer> list1=new ArrayList<Integer>();
          list1.add(1);
          list1.add(2);
          ...
          
          ArrayList<Integer> list2=new ArrayList<Integer>();
          list2.add(1);
          list2.add(2);
          ...
          

          那么,

          intMap.put(1,list1);
          intMap.put(2,list2);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-11-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多