JAVA - 加速哈希地图创建

Fab*_*Fab 4 java hashmap

我会尽量保持清醒.

我有N个对象列表.每个对象都存储一个ID字段和一个值字段.

LIST A | ID1   v1  | ID2   v2  | ID3   v3  |
LIST B | ID1   v1' | ID2   v2' | ID3   v3' |
LIST C | ID1   v1''| ID2   v2''| ID3   v3''|
Run Code Online (Sandbox Code Playgroud)

我需要创建一个哈希映射

Map<Integer,List<Double>> 
Run Code Online (Sandbox Code Playgroud)

像这样:

------------------------
| ID1 |  v1  v1'  v1'' |
| ID2 |  v2  v2'  v2'' |
| ID3 |  v3  v3'  v3'' |
------------------------
Run Code Online (Sandbox Code Playgroud)

对于每个列表,我现在使用此代码:

object_list.forEach( v -> {
        String id = v.getID();
        Double value = v.getValue();

        if(map.containsKey(id)){
            map.get(id).add(value);
        }
        else{
            List<Double> list = new ArrayList<>();
            list.add(value);
            map.put(id, list);
        }
});
Run Code Online (Sandbox Code Playgroud)

我的问题:我能以更快的方式执行此操作吗?

谢谢

Kli*_*cou 8

您可以使用Java 8的方便computeIfAbsent方法非常有效地执行此操作:

objectList.forEach( v -> {
    List<Double> doubleList = map.computeIfAbsent(v.getID(), k->new ArrayList<>());
    doubleList.add(v.getValue());
});
Run Code Online (Sandbox Code Playgroud)

请注意,这不一定比原始解决方案运行得更快.它的优点是阅读更清晰.


chr*_*con 6

使用guava的multimap会更直接.

ListMultimap<Integer, Double> multimap = ArrayListMultimap.create();
Run Code Online (Sandbox Code Playgroud)

那么你可以put(),番石榴为你处理剩下的事情:

String id = v.getID();
Double value = v.getValue();
multimap.put(id, value);
Run Code Online (Sandbox Code Playgroud)

如果id存在,则将值添加到其中,否则将创建新密钥.