0

我有以下情况:

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

我想避免对 newSet 重新排序,因为 HeavyToCompare 比较起来非常昂贵。相反,我想保留插入顺序(与原始集相同)。我知道我可以创建一个始终返回 -1 的简单比较器,但这违反了 compareTo 的合同。这里的最佳做法是什么?我需要类似的东西

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

更新:我无法更改 SortedSet,这是一项要求

4

3 回答 3

1

您可以使用 a LinkedHashSet,它是Set按插入顺序迭代的 a :

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

但是,它不是一个SortedSet,但希望这不是一个要求。

于 2013-01-15T13:25:45.640 回答
0

我会尝试记录sortedSet出现在对象中的位置。然后您可以在调用重比较之前比较位置。

您如何实现这一点将取决于您的更多代码。

于 2013-01-15T13:18:57.523 回答
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 回答