JAVA - 加速哈希地图创建

时间:2016-12-20 15:20:17

标签: 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''|

我需要创建一个哈希映射

Map<Integer,List<Double>> 
像这样:

------------------------
| ID1 |  v1  v1'  v1'' |
| ID2 |  v2  v2'  v2'' |
| ID3 |  v3  v3'  v3'' |
------------------------

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

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);
        }
});

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

由于

4 个答案:

答案 0 :(得分:8)

你可以使用Java 8的方便computeIfAbsent方法非常有表现力地做到这一点:

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

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

答案 1 :(得分:6)

使用番石榴的多重映射会更直接。

ListMultimap<Integer, Double> multimap = ArrayListMultimap.create();

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

String id = v.getID();
Double value = v.getValue();
multimap.put(id, value);

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

答案 2 :(得分:3)

问题是:你为什么对目前的表现不满意?

您是否对当前代码进行了基准测试?

此代码是否运行超过;说每分钟10K次?

您的用户是否抱怨性能问题;你仔细分析并发现这段代码是罪魁祸首吗?

如果您使用 no 回答了所有这些问题,那么您可能没有遇到任何问题。

鉴于你真的有问题;当然,Kiltos的解决方案可能会有所缓解。但我认为你应该更进一步,研究整体数据流。例如:您假设您花费了大量时间从现有列表中检索此数据。也许你应该调查,如果你可以避免建立初始列表;而是以一种首先需要较少转换工作的方式提供所需数据!

此外:您已经在使用流。也许你可以在这里并行

答案 3 :(得分:1)

如果N个项目的意思是他们的数字是固定的,那么你可以创建一个大小的地图,当满满时不会扩展。

Map<Integer,List<Double>> map = new HashMap<Integer,List<Double>>(N, 1);