我们说我有一个对象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
你能指出任何解决方案吗?
答案 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()一次,就不会有异常。