使用Iterator迭代2D数组,就好像它是一维数组一样

时间:2017-02-04 08:27:27

标签: java arrays multidimensional-array iterator

我是Java的初学者,我必须接受Iterator<Iterator<Integer>>之类的价值观。例如,我们可能有:

{{1, 2}, {3, 4}, {5, 6}}

next()的结果应为1。如果我们再次尝试next() - 2,那么 - 34等。就像逐个从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,因为此处有例外。如何解决这个问题?

4 个答案:

答案 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();