在地图中正确填充列表

Posted

技术标签:

【中文标题】在地图中正确填充列表【英文标题】: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>());
    
    

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

【问题讨论】:

【参考方案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);

【讨论】:

以上是关于在地图中正确填充列表的主要内容,如果未能解决你的问题,请参考以下文章

单击时滚动到不滚动到正确的列表项

在 NavigationView 中清除 SwiftUI 列表未正确返回默认值

Flutter 在无限循环中发送 http 请求

Google 地图自动填充的“place_changed”以外的事件

使用 MySQL、JSON 和 jQuery 插件 Gmap3 填充 Google 地图标记

使用ggplotly映射无法正确显示(R)