我有一个Hashmap,它由固定数量的键组成,这些键是预防性填充的。现在,在循环中,我必须检查每个键以替换必须更改的值。
可悲的是,由于需要迭代次数,它非常慢。我真的很想维护一个键值结构,因为它在模块的顶部和结尾使用,但是我至少希望提高性能。
我还考虑过使用arrayList来缩短插入时间,但是那样的话搜索会变慢,并且我会失去键值功能。 如果我先对键上的arraylist排序,然后通过二进制搜索查找值怎么办?
在地图上进行搜索和书写是否有更好的解决方案?
谢谢
编辑:代码
for (Entry<String, VariableInfo> entry : VariablesMap.entrySet()){
String varName = entry.getKey();
VariableInfo info = entry.getValue();
Object value = info.convertToValue();
DialogWait dialogWindow = new DialogWait();
SwingWorker<Void, Void> swingWorker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
while(newTimeSet != _record.getCurrentTimeMs()) {
_record.stepForward();
if(valuesMap.get(varName)!=value)
valuesMap.put(varName, value);
}
dialogWindow.close();
return null;
}
};
swingWorker.execute();
dialogWindow.makeWait("Loading");
}
答案 0 :(得分:1)
现在,在循环中,我必须检查每个键以替换必须更改的值。
如果必须更改值的条件变为true,是否可以更新列表?因此,基本上,您能否在地图外部重写代码以对更改做出反应,而不是根据状态定期更改地图?通常,这是对性能的相当有力的改进,它将使您的地图更加有用,因为它是最新的。
如果您确实必须定期检查Map中的每个条目,那么使用O(n)
并对其进行迭代,就可以得到map.entrySet()
的运行时。假设您无法预测有关输入映射的信息,则无法对其进行优化。
如果您有某些条目,这些条目以较高的频率或概率发生变化,则可以通过在此处应用比其他条目更高的检查频率来进行优化。为此,您可以使用LinkedHashMap
。使用它,您可以插入元素,并且列表会跟踪插入的顺序。有了它,您可以轻松记住最后n
个更改的元素,并将其优先于其他元素。