0

我有一个获取 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;
}

这是一个性能杀手,我可以在这里改进什么?

4

3 回答 3

2

我看不出你的代码有什么问题;您真正能做的就是尝试SortedMap. 第一个是ConcurrentSkipListMap,然后查看Commons CollectionsGoogle CollectionsGNU Trove。后者可以产生非常好的结果,特别是如果您的地图的键和值是原始类型。

于 2009-12-16T11:54:03.797 回答
2

输入是否需要为 SortedMap?对我来说,如果输入只是一个集合或列表似乎会更容易。这可能会加快创建输入的速度,并可能使所有包含的地图的迭代速度更快。

除此之外,我认为提高此代码性能的最可能的来源是提高正在合并的排序映射中的值的 compareTo() 实现的速度。

于 2009-12-16T12:06:26.820 回答
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;
  }

}

NestedKey用作 SortedMap 的键的条目NestedKey通过比较其每个条目来与其他对象进行比较。存在于所有元素中但具有更多条目的 NestedKeys 被假定为更大。因此,您有这样的关系:

  • 嵌套键(1, 2, 3) < 嵌套键(1, 2, 4)
  • 嵌套键(1, 3, 3) < 嵌套键(2, 1, 1)
  • 嵌套键(1, 2, 3) < 嵌套键(2)

如果您只使用一个使用 NestedKey 作为其键的 SortedMap,那么它的.values()集合会自动返回所有条目,并将其展平。但是,如果您只想使用 SortedMap 的一部分,则必须使用.subMap. 例如,如果您希望所有条目在 2 和 3 之间使用 NestedKeys,请使用.subMap(new NestedKey(2), new NestedKey(3))

于 2009-12-16T12:28:50.300 回答