This question already has answers here:
How to have a key with multiple values in a map?
                                
                                    (6个答案)
                                
                        
                3年前关闭。
            
        

在我从事的各种项目中,我发现了一个类似的模式

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

public void addValue(Integer key, String value) {
    if (!listMap.containsKey(key)) {
        listMap.put(key, new ArrayList<String>());
    }
    listMap.get(key).add(value);
}


填充以Lists作为值的地图。

因为这是一种常见的模式,所以我想知道标准库中是否没有任何便利类,或者是否有像番石榴这样的东西来管理对该结构的添加和删除值。

最佳答案

番石榴提供Multimap,它非常适合您的目的:

ListMultimap<Integer, String> listMap = ArrayListMultimap.create();

public void addValue(Integer key, String value) {
    listMap.put(key, value);
}

public List<String> getValues(Integer key) {
    return listMap.get(key);
}

public Map<Integer, List<String>> asMap() {
    // See documentation for details
    return Multimaps.asMap(listMap);
}


Java 8还提供了一种更方便的方法来在单个语句中获取和初始化值:

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

public void addValue(Integer key, String value) {
    listMap.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}


顺便说一句,我会稍微修改您的原始示例,以避免在找到匹配的键时进行额外的查找:

public void addValue(Integer key, String value) {
    List<String> values = listMap.get(key);
    if (values == null) {
        listMap.put(key, values = new ArrayList<>());
    }
    values.add(value);
}

09-25 20:17