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

Get all possible pairs of elements in a 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

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

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

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);
        }
    }

您正在执行 iterator.next() 两次。创建 innerIterator 时一个在 sysout 另一个里面。

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

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

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