如何在Java中将数据从数据集传输到SortedSet

如何在Java中将数据从数据集传输到SortedSet,java,deque,sortedset,Java,Deque,Sortedset,我得到一个Deque-Deque,我想将所有元素转移到另一个结构:SortedSet-SortedSet sortedSet中元素的顺序与从deque弹出元素的顺序相同 例如:如果所有元素按顺序从deque弹出:E01、E02、…、E10。 存储在sortedSet中的元素序列也是E01、E02、…、E10 我不知道如何覆盖比较器,让元素以这样的顺序存储 你知道怎么做吗?好吧,这太奇怪了。您希望有一个SortedSet,其中的元素按迭代顺序排列 对于这个奇怪的问题,这里有一个奇怪的解决方案: /

我得到一个
Deque-Deque
,我想将所有元素转移到另一个结构:
SortedSet-SortedSet

sortedSet中元素的顺序与从deque弹出元素的顺序相同

例如:如果所有元素按顺序从
deque
弹出:
E01、E02、…、E10
。 存储在
sortedSet
中的元素序列也是
E01、E02、…、E10

我不知道如何覆盖比较器,让元素以这样的顺序存储


你知道怎么做吗?

好吧,这太奇怪了。您希望有一个
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);

如前所述,您需要一个
LinkedHashSet
,一个保持插入顺序的集合:

Set<Element> convertToSet(Deque<Element> dq)
{
LinkedHashSet<Element> lhs = new LinkedHashSet<Element>():
while(!dq.isEmpty())
{
lhs.add(dq.peekFirst());
}

return lhs;
}
Set convertToSet(设定dq)
{
LinkedHashSet lhs=新LinkedHashSet():
而(!dq.isEmpty())
{
添加(dq.peekFirst());
}
返回lhs;
}

简,我写了一个简单的代码:

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
    }
publicstaticvoidmain(字符串[]args){
SortedSet集合=新树集合(新比较器(){
@凌驾
公共整数比较(整数i1、整数i2){
返回1;
}
});
Deque deq=新链接列表();
deq.add(5);
deq.add(1);
deq.add(3);
set.addAll(deq);
System.out.println(deq);//5,1,3
}
比较器应始终
返回1
,这样顺序保持不变,如果这是您的问题。

警告:此解决方案违反了
可比
设置
合同。小心使用。

那么为什么要使用
SortedSet
?为什么不使用一个简单的
ArrayList
。它很容易使用,也能达到目的。等等,你想要自然排序迭代顺序还是插入迭代顺序?如果是后者,您应该使用
LinkedHashSet
,而不是
SortedSet
,因为另一个函数只接受排序集作为其参数之一,我无法更改该函数的接口。@fge,SortedSet可以通过树集实现。由于上下文的关系,我必须创建一个SortedSet对象。在您的示例中,当您从中弹出时,
Deque
中的元素是否总是按自然顺序排列,或者它们可以是任何顺序?如果我只是使用Deque作为TreeSet构造函数的参数,那么sortedSet中的所有元素是否都按我上面提到的顺序排列?您还没有告诉我们的是您真正期望的顺序!这真的不清楚你想要什么。
Foo
是否实现了
compariable
?如果是这样,您希望返回一个元素按自然顺序或插入顺序排列的集合吗?这是最好的答案。这是一种非常有创意的方法,可以解决看似不一致的需求。@DavidWallace事实上,这是可以信赖的,但我的天啊,这很难看。我认为你的方法是正确的。Thx,Tomas.我想问一下,在'set.addAll(deq)'之后,deq是否变为空?不,您必须调用
deq.clear()请接受答案,如果它有效的话。呃,不,这里的
可比
合同被打破了,所以这个比较者会告诉我5>1,但是如果我与相反的参数进行比较,也会告诉我1>5?凉的违反
实现者必须确保所有x和y的sgn(比较(x,y))==-sgn(比较(y,x))。
,请参阅,T)。只需使用
LinkedHashSet
来维护插入顺序。
peekFirst
不会删除元素。如果要删除并返回第一个元素,则需要
pollFirst
removeFirst
。不幸的是,
LinkedHashSet
没有实现
SortedSet
,这是一项要求。然而,这项要求可能是基于这样一种想法,即他希望以某种方式(迭代顺序)对集合进行“排序”,从而认为他需要
SortedSet
。也许我在这里假设的太多了,也许。实际上,我将Jane的评论解释为,她将把这个结构传递到一个带有
SortedSet
类型参数的方法中,但可能我误解了她。当然,我的回答是假设人们不必使用SortedSet。
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
    }