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

时间:2014-03-17 07:36:52

标签: java deque sortedset

我得到Deque<Element> deque,我想将所有元素转移到其他结构:SortedSet<Element> sortedSet

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

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

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

你知道怎么做吗?

3 个答案:

答案 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这样的顺序保持不变。 警告:此解决方案违反了ComparableSet合同。请谨慎使用。