【问题标题】:properly populate a list in a map在地图中正确填充列表
【发布时间】:2017-09-12 00:22:12
【问题描述】:

我有一张地图,它的值是一个整数列表。如果在阅读器中找到密钥,我必须在列表中添加一个整数。我下面的代码每次都有效,除了一个。换句话说,如果键存在 5 次,列表会说它只有 4 次。我错过了什么?谢谢!

Map<String, List<Integer>> map = new TreeMap<String, List<Integer>>();
String key; // the string from my reader

if (map.containsKey(key)) {
    map.get(key).add(value); //value being an integer gotten earlier
}

我的代码在构造函数中将键添加到地图中,如下所示:

while (reader.ready()) {
    key = reader.readLine();
    if(!key.isEmpty()) {
        map.put(key, new ArrayList<Integer>());
    }
}    

如果没有找到键我不需要做任何事情,只需在找到时添加值即可。

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    您发布的代码 sn-p 不是您实际的完整代码,但无论如何您需要有逻辑来处理第一次看到键时。在第一种情况下,您应该初始化要存储在地图中的整数列表。像这样的:

    public static void addValue(String key, Integer value,
        Map<String, List<Integer>> map) {
        List<Integer> list = map.get(key);
        if (list == null) {
            list = new ArrayList<>();
        }
        list.add(value);
    }
    
    public static void main(String[] args) {
        Map<String, List<Integer>> map = new TreeMap<String, List<Integer>>();
        String key; // the string from my reader
        Integer value;
        addValue(key, value, map);
    }
    

    【讨论】:

      【解决方案2】:

      如果找不到密钥,你如何处理?如果找不到键,我怀疑您错过了将第一个 Integer 值添加到列表中。

      if (map.containsKey(key)) {
          map.get(key).add(value); //value being an integer gotten earlier
      } else {
          List<Integer> list = new ArrayList<>();
          list.add(value); //add value to the list
          map.put(key, list);
      }
      

      【讨论】:

        【解决方案3】:

        希望这能帮助您解决问题。

        //if key not exists insert key    
            if(!map.containsKey(key)){
                   List<Integer> list = new ArrayList<Integer>();
                   list.add(value);
                   map.put(key,list);
                }
            //if key exists do this...
            else{
                  List<Integer> list = new ArrayList<Integer>();
                  //Getting previous existing elements on map at that index and adding to list back
                  list.addAll(map.get(key));
                  map.put(list);
                }
        

        【讨论】:

          【解决方案4】:

          您没有提到要修改相同的列表,只有当它是相同的列表时才能修改映射值,您可以使用 java 8

          map.entrySet().forEach(entry -> {
                  if ("5" == entry.getKey()) {
                      ((List) entry.getValue()).add(5);
                      System.out.println(entry.getValue());
                  }
          });
          

          【讨论】:

            【解决方案5】:

            您可以使用 computeIfAbsent:

            map.computeIfAbsent(key, k -> new ArrayList<>()).add(yourValue);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-09-20
              • 1970-01-01
              • 1970-01-01
              • 2023-03-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多