簡體   English   中英

JAVA - 加速哈希地圖創建

[英]JAVA - Speedup hash map creation

我會盡量保持清醒。

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

我的問題:我能以更快的方式執行此操作嗎?

謝謝

你可以使用Java 8的方便的computeIfAbsent方法非常有表現力地做到這computeIfAbsent

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

請注意,這不一定比原始解決方案運行得更快。 它的優點是閱讀更清晰。

使用guava的multimap會更直接。

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

然后你可以put() ,guava為你處理剩下的事情:

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

如果id存在,則將值添加到其中,否則將創建新密鑰。

問題是:你為什么對目前的表現不滿意?

您是否對當前代碼進行了基准測試?

這段代碼運行的次數是多少; 說每分鍾10K次?

您的用戶是否抱怨性能問題; 你仔細分析並發現這段代碼是罪魁禍首?

如果你的回答所有這些問題沒有 ,有機會,你不會有問題。

鑒於你在這里真的有問題; 當然,Kiltos的解決方案可能會有所緩解。 但我認為你應該更進一步,研究整體數據流。 例如:您假設您花費了大量時間從現有列表中檢索此數據。 也許你應該調查,如果你可以避免建立初始列表; 而是以一種首先需要較少轉換工作的方式提供所需數據!

此外:您已經在使用流。 也許你可以在這里並行

如果N個項目表示他們的數字是固定的,那么你可以創建一個大小的地圖,當滿滿時它不會擴展。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM