获取TreeSet中所有可能的元素对

时间:2016-07-07 09:29:36

标签: java iterator permutation treeset

我们说我有一个对象x的TreeSet。我想要做的是迭代所有对象并获得所有可能的对。到目前为止,我已经来到了下面的代码

TreeSet<x> ts = new TreeSet<>();
ts.add(new x(3, true));
ts.add(new x(1, true));
ts.add(new x(2, true));
ts.add(new x(5, true));
ts.add(new x(4, true));
Iterator<x> iterator = setOfX.iterator();
    while (iterator.hasNext()) {
        System.out.println("ID:"+iterator.next());
        Iterator<x> innerIterator = setOfX.tailSet(iterator.next(), true).iterator();
        while (innerIterator.hasNext()) {
            int id = innerIterator.next().id;
            System.out.println(id);
        }
    }

但是输出看起来好运了一些组合,加上它以异常退出

ID:1:true
2
3
4
5
ID:3:true
4
5
ID:5:true
Exception in thread "main" java.util.NoSuchElementException

你能指出任何解决方案吗?

2 个答案:

答案 0 :(得分:2)

问题是您要拨打iterator.next()两次。请注意,此方法不仅获取迭代器当前指向的内容,还将迭代器推进到下一个元素。每次迭代只调用iterator.next()一次,并将其返回值存储在变量中:

TreeSet<x> ts = new TreeSet<>();
ts.add(new x(3, true));
ts.add(new x(1, true));
ts.add(new x(2, true));
ts.add(new x(5, true));
ts.add(new x(4, true));
Iterator<x> iterator = setOfX.iterator();
    while (iterator.hasNext()) {
        // Call iterator.next() only once per iteration
        x value = iterator.next();

        System.out.println("ID:"+value);
        Iterator<x> innerIterator = setOfX.tailSet(value, true).iterator();
        while (innerIterator.hasNext()) {
            int id = innerIterator.next().id;
            System.out.println(id);
        }
    }

答案 1 :(得分:1)

你正在做iterator.next()两次。创建innerIterator时,其他一个内部sysout。

    System.out.println("ID:"+iterator.next());

    Iterator<x> innerIterator = setOfX.tailSet(iterator.next(),true).iterator();

每次调用iterator.hasNext()时使用next()一次,就不会有异常。