我有以下情况:
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,这是必需的
发布于 2013-01-15 21:25:46
您可以使用LinkedHashSet,它是一个按插入顺序迭代的Set:
Set<HeavyToCompare> newSet = new LinkedHashSet<HeavyToCompare>();然而,它不是一个SortedSet,但希望这不是一个要求。
发布于 2013-01-15 21:18:58
我会尝试在sortedSet中记录对象出现的位置。然后,您可以在调用重比较之前比较位置。
如何实现这一点将取决于更多的代码。
发布于 2013-01-15 23:54:40
您可以使用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"https://stackoverflow.com/questions/14338580
复制相似问题