我会尽量保持清醒.
我有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)
我的问题:我能以更快的方式执行此操作吗?
谢谢
您可以使用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)
请注意,这不一定比原始解决方案运行得更快.它的优点是阅读更清晰.
使用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存在,则将值添加到其中,否则将创建新密钥.
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |