我得到Deque<Element> deque
,我想将所有元素转移到其他结构:SortedSet<Element> sortedSet
。
sortedSet中的元素序列与从deque中弹出元素的序列相同。
例如:如果所有元素都按顺序从deque
弹出:E01, E02, ..., E10
。
存储在sortedSet
中的元素序列也是E01, E02, ..., E10
。
我不知道如何覆盖比较器以让元素以这样的顺序存储。
你知道怎么做吗?
答案 0 :(得分:1)
好的,这是最离奇的。您期望在迭代顺序中包含SortedSet
元素...
这是一个奇怪的解决方案:
// final is CRITICAL here
final List<Element> list = new ArrayList<>(deque);
deque.clear();
final Comparator<Element> cmp = new Comparator<>()
{
@Override
public int compare(final Element a, final Element b)
{
return Integer.compare(list.indexOf(a), list.indexOf(b));
}
}
return new TreeSet<>(list, cmp);
HOWEVER :如果Deque
中没有两个元素.equals()
,这只能可靠地运行!
但考虑到要求的固有不兼容性,这是您能做的最好的事情。总而言之,我怀疑是XY问题..
是一种使其可靠的方法,但这需要您使用Guava:
final Equivalence<Object> eq = Equivalence.identity();
final Function<Element, Equivalence.Wrapper<Object>> f = new Function<>()
{
@Override
public Equivalence.Wrapper<Object> apply(final Element input)
{
return eq.wrap(input);
}
}
final List<Element> list = Lists.newArrayList(deque);
deque.clear();
final List<Equivalence.Wrapper<Object>> wrapped = Lists.transform(list, f);
final Comparator<Element> cmp = new Comparator<>()
{
@Override
public int compare(final Element a, final Element b)
{
return Integer.compare(wrapped.indexOf(f(a)),
wrapped.indexOf(f(b)));
}
};
return new TreeSet<>(list, cmp);
答案 1 :(得分:0)
正如fge已经说明的那样,你需要一个LinkedHashSet
,一个保持插入顺序的集合:
Set<Element> convertToSet(Deque<Element> dq)
{
LinkedHashSet<Element> lhs = new LinkedHashSet<Element>():
while(!dq.isEmpty())
{
lhs.add(dq.peekFirst());
}
return lhs;
}
答案 2 :(得分:-2)
简,我写了一个简单的代码:
public static void main(String[] args) {
SortedSet<Integer> set = new TreeSet<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer i1, Integer i2) {
return 1;
}
});
Deque<Integer> deq = new LinkedList<Integer>();
deq.add(5);
deq.add(1);
deq.add(3);
set.addAll(deq);
System.out.println(deq); // 5,1,3
}
如果这是您的问题,比较器应始终return 1
这样的顺序保持不变。
警告:此解决方案违反了Comparable
和Set
合同。请谨慎使用。