我是Java的初学者,我必须接受Iterator<Iterator<Integer>>
之类的价值观。例如,我们可能有:
{{1, 2}, {3, 4}, {5, 6}}
next()
的结果应为1
。如果我们再次尝试next()
- 2
,那么 - 3
,4
等。就像逐个从1D数组中获取值,但是从2D数组中获取值。我们应该不要复制任何东西。所以,我在下面写了一些不好的代码:
public class IteratorNext {
private Iterator<Iterator<Integer>> values = null;
private Iterator<Integer> current;
public IteratorNext(Iterator<Iterator<Integer>> iterator) {
this.values = iterator;
}
public int next() throws NoSuchElementException {
current = values.next();
if (!current.hasNext()) {
values.next();
}
if (!values.hasNext() && !current.hasNext()) {
throw new NoSuchElementException("Reached end");
}
return current.next();
}
}
该代码不正确,因为next()
的结果是1
,然后是3
,然后是5
,因为此处有例外。如何解决这个问题?
答案 0 :(得分:1)
如果您使用的是 Java-8 ,则可以利用flatMapToInt
函数将2D数组转换为一维数组(array2d
可以假设为是对2D阵列的引用):
Arrays.stream(array2d).flatMapToInt(Arrays::stream).forEach(System.out::println);
如果您想坚持使用您的解决方案,则需要修改next
方法,如下所示:
public int next() throws NoSuchElementException {
int result = -1;
//Are we already iterating one of the second dimensions?
if(current!=null && current.hasNext()) {
//get the next element from the second dimension.
result = current.next();
} else if(values != null && values.hasNext()) {
//get the next second dimension
current = values.next();
if (current.hasNext()) {
//get the next element from the second dimension
result = current.next();
}
} else {
//we have iterated all the second dimensions
throw new NoSuchElementException("Reached end");
}
return result;
}
答案 1 :(得分:1)
public static class IteratorNext {
private Iterator<Iterator<Integer>> values = null;
private Iterator<Integer> current;
public IteratorNext(Iterator<Iterator<Integer>> iterator) {
this.values = iterator;
}
public int next() throws NoSuchElementException {
if (current != null && current.hasNext()) {
Integer val = current.next();
return val;
}
if (values != null && values.hasNext()) {
current = values.next();
if (current != null && current.hasNext()) {
Integer val = current.next();
return val;
}
}
throw new NoSuchElementException("Reached end");
}
}
答案 2 :(得分:0)
每次调用next()时,都必须处理结果。
next()方法的第一行是跳过第一个元素,因为你在next()方法的末尾调用了current.next()。
更一般地说,此代码不是处理集合的正确方法。你必须在使用方面分析问题。
答案 3 :(得分:0)
问题在于每次调用next()时都会以
开头 current = values.next();
因此,在每次调用时,您都跳到下一个迭代器,而不是尝试继续迭代当前。
相反,你应该做像
这样的事情if(!current.hasNext())
current = values.next();