所以这就是我面临的情况:我有可称为节点的可迭代对象。 (大约数千)每个节点包含许多对键和值。 我的算法创建一个新节点(称之为myNode)并检查可迭代集中的每个节点,并且 对于可迭代集中的每个节点: 对于节点中的每对(键,值): 如果myNode包含该对的键: 如果myNode的相应值更大: 替换为新值。 else:myNode.put(key,value)
目前,我正在使用HashMap并且它非常慢并且在用ArrayList替换HashMap之后我实际上得到了更好的结果,这很奇怪。 有人可以建议使用更好的数据结构来提高程序的性能吗?
谢谢!
EDI:CODE
ArrayList<Long> newDist = new ArrayList<Long>();
HashMap<Long, Long> myNode = new HashMap<Long, Long>();
for (Node i : nodes){//copy neighbors to set
Set<Long> view = i.keySet();
for (Long j : view) {
if (!(myNode.containsKey(j))) {
myNode.put(j, i.get(j));
} else if (myNode.get(j) > i.get(j)) {
myNode.put(j, i.get(j));
}
}
}
context.write(key, myNode);
答案 0 :(得分:0)
我不确定你的代码意图是什么,因为它引用了一些你没有包含的对象,但是如果Node
是Map
那么我会做类似......
Map<Long, Long> lowScores = new HashMap<Long, Long>();
for (Node node : nodes){
for (Entry<Long,Long> entry : node.entrySet()) {
Long lowScore = lowScores.get(entry.getKey());
if (lowScore == null || lowScore > entry.getValue()){
lowScores.put(entry.getKey(), entry.getValue());
}
}
}
这里有一些优化限制了在大型数据结构上完成的操作量,但我只是运行将证明这是优化编译器尚未针对您优化的事情。关键优化是迭代Entry
的{{1}}个对象,而不是继续调用Map
和get
。