Java 分类集变换

Java 分类集变换,java,guava,comparator,compareto,sortedset,Java,Guava,Comparator,Compareto,Sortedset,我有以下情况: SortedSet<MyClass> sortedSet = ...; SortedSet<HeavyToCompare> newSet = ...; for (MyClass m: sortedSet ){ newSet.add(m.getHeavyToCompare()) } SortedSet-SortedSet=。。。; SortedSet新闻集=。。。; 用于(MyClass m:分类数据集){ newSet.add(m.getHeav

我有以下情况:

SortedSet<MyClass> sortedSet = ...;
SortedSet<HeavyToCompare> newSet = ...;
for (MyClass m: sortedSet ){
newSet.add(m.getHeavyToCompare())    
}
SortedSet-SortedSet=。。。;
SortedSet新闻集=。。。;
用于(MyClass m:分类数据集){
newSet.add(m.getHeavyToCompare())
}
我想避免对新闻集进行重新排序,因为进行比较非常昂贵。相反,我希望保持插入顺序(与原始集相同)。 我知道我可以创建一个总是返回-1的简单比较器,但这打破了compareTo的约定。 这里的最佳实践是什么?我需要像这样的东西

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

更新:我无法更改分拣集,这是一项要求,我将尝试记录对象出现在
分拣集
中的位置。然后可以在调用重比较之前比较位置

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

您可以使用,这是一个按插入顺序迭代的
集合:

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

然而,它不是一个分类数据集,但希望这不是一个要求。

您可以用番石榴硬编码一个比较顺序。但是,这会产生有限的
分类数据集
。具体地说,它的比较方法(
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"
//在实际代码中,此值列表将在循环中计算:
列表值=数组.asList(2,4,6,8);
比较器比较器=排序。显式(值);
SortedSet set=Sets.newTreeSet(比较器);
set.addAll(值);
套头戴式耳机(4);//好的:[2]
套头戴式耳机(5);//异常:“无法比较值:5”

你不能用
ArrayList
而不是第二个
SortedSet
?或
LinkedHashSet
,至少。谢谢,但我不能更改SortedSet,否则就不会有任何问题。除了编写自己的包装器
SortedSet
实现之外,不会有任何解决方案满足您的需求。Guava可能不会支持这一点,因为无法强制保证生成的
SortedSet
是有序的。你是对的,我最终做了自己的SortedSet。不幸的是,这是一个要求,我的问题由此产生。感谢你提出订购。显式。但是,这并不能解决我的问题,因为这两个集合的类型不同。re:不同的类型:你指的是输入和输出集合?这应该还可以:只需更改循环,将输出值临时插入列表,而不是SortedSet。然后,您有一个集合,它(a)包含输出类型的元素,(b)按所需顺序迭代元素,并且(c)不需要任何比较来创建。唯一的问题是它不是一个分类集。但我们可以解决这个问题。获取您创建的列表,并将其传递给Ordering.explicit。使用生成的比较器创建一个树集,您可以将输出元素转储到其中。完成。