0

入力として SortedMap を取得するメソッドがあります。このマップは多くの SortedMap オブジェクトを保持します。このメソッドの出力は、入力マップに保持されているマップのすべての要素を含む 1 つの 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 Collections、およびGNU 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;
  }

}

NestedKeySortedMap のキーとして使用されるエントリは、各エントリを比較することによって他のオブジェクトNestedKeyと比較されます。存在するすべての要素にあるが、より多くのエントリを持つ NestedKeys は、より大きいと見なされます。したがって、次のような関係があります。

  • NestedKey(1, 2, 3) < NestedKey(1, 2, 4)
  • NestedKey(1, 3, 3) < NestedKey(2, 1, 1)
  • NestedKey(1, 2, 3) < NestedKey(2)

NestedKey をキーとして使用する SortedMap を 1 つだけ使用すると、その.values()セットは自動的にすべてのエントリを平坦化して返します。ただし、SortedMap の一部のみを使用する場合は、.subMap. たとえば、すべてのエントリで 2 と 3 の間の NestedKeys を使用する場合は、次を使用します。.subMap(new NestedKey(2), new NestedKey(3))

于 2009-12-16T12:28:50.300 に答える