我有一个方法将SortedMap作为输入,此地图包含许多SortedMap对象,此方法的输出应该是一个SortedMap,其中包含输入映射中保存的地图的所有元素。方法如下所示:
private SortedMap mergeSamples(SortedMap map){
SortedMap mergedMap = new TreeMap();
Iterator sampleIt = map.values().iterator();
while(sampleIt.hasNext())
{
SortedMap currMap = (SortedMap) sampleIt.next();
mergedMap.putAll(currMap);
}
return mergedMap;
}
这是一个性能杀手,我可以在这里改进什么?
答案 0 :(得分:2)
我认为您的代码没有任何问题;你所能做的就是尝试SortedMap
的替代实现。第一个是ConcurrentSkipListMap,然后查看Commons Collections,Google Collections和GNU Trove。后者可以产生非常好的结果,特别是如果你的地图的键和值是原始类型。
答案 1 :(得分:2)
是否要求输入为SortedMap?对我来说,如果输入只是一个集合或列表似乎更容易。这可能会加快创建输入,并可能更快地迭代所有包含的地图。
除此之外,我认为提高此代码性能的最可能的方法是提高compareTo()实现合并的有序映射中的值的速度。
答案 2 :(得分:1)
您的代码尽可能好。但是,在我看来,数据结构的整体设计需要进行一些检查:您使用的是SortedMap<?, SortedMap<?, ?>
,但未使用父地图的键。
你想表达一个带有嵌套元素的树吗?你的任务是展平树吗?如果是这样,要么创建一个支持您的方法的Tree类,要么使用智能方法来合并键:
public class NestedKey implements Comparable<NestedKey> {
private Comparable[] entries;
public NestedKey(Comparable... entries) {
assert entries != null;
this.entries = entries;
}
public int compareTo(NestedKey other) {
for(int i = 0; i < other.entries.length; i++) {
if (i == entries.length)
return -1; // other is longer then self <=> self is smaller than other
int cmp = entries[i].compareTo(other.entries[i]);
if (cmp != 0)
return cmp;
}
if (entries.length > other.entries.length)
return 1; // self is longer than others <=> self is larger than other
else
return 0;
}
}
用作SortedMap键的NestedKey
条目通过比较其每个条目与其他NestedKey
个对象进行比较。存在于所有元素中但具有更多条目的NestedKeys被假定为更大。因此,你有这样的关系:
如果您只使用一个使用NestedKey作为其键的SortedMap,则其.values()
设置会自动返回所有条目,展平。但是,如果您只想使用SortedMap的一部分,则必须使用.subMap
。例如,如果您希望NestedKeys的所有条目都在2到3之间,请使用.subMap(new NestedKey(2), new NestedKey(3))