[英]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.