0

私は次の場合があります:

SortedSet<MyClass> sortedSet = ...;
SortedSet<HeavyToCompare> newSet = ...;
for (MyClass m: sortedSet ){
newSet.add(m.getHeavyToCompare())    
}

HeavyToCompareは比較するのに非常に費用がかかるため、newSetの並べ替えは避けたいと思います。むしろ、挿入順序を維持したい(つまり、元のセットと同じです)。常に-1を返す単純なコンパレータを作成できることは理解していますが、これはcompareToの契約を破ります。ここでのベストプラクティスは何ですか?私は次のようなものが必要になります

SortedSet<K> result = Sets.transformAndKeepOrder(SortedSet<T> from, Function<T, K> function)

更新:SortedSetを変更できません。これは要件です。

4

3 に答える 3

1

を使用できますLinkedHashSet。これは、Set挿入順序で繰り返されます。

Set<HeavyToCompare> newSet = new LinkedHashSet<HeavyToCompare>();

ただし、これはSortedSet必須ではありませんが、必須ではないことを願っています。

于 2013-01-15T13:25:45.640 に答える
0

Guavaのと比較順序をハードコーディングできますOrdering.explicit。ただし、これにより制限が発生しSortedSetます。具体的には、その比較メソッド(headSetなど)は、引数がセットのメンバーである場合にのみ機能します。結局のところ、Ordering.explicitあなたがそれを提供する値を比較する方法を知っているだけです。より具体的には:

// In the real code, this values list will be computed in your loop:
List<Integer> values = Arrays.asList(2, 4, 6, 8);

Comparator<Integer> comparator = Ordering.explicit(values);
SortedSet<Integer> set = Sets.newTreeSet(comparator);
set.addAll(values);
set.headSet(4); // OK: [2]
set.headSet(5); // exception: "Cannot compare value: 5"
于 2013-01-15T15:54:39.727 に答える
0

オブジェクトが表示されるオブジェクトの位置を記録しようとしsortedSetます。次に、重い比較を呼び出す前に、位置を比較できます。

それをどのように達成するかは、コードの多くに依存します。

于 2013-01-15T13:18:57.523 に答える