从二维数组中顺序接收元素(Java)

时间:2017-01-31 18:25:53

标签: java arrays loops multidimensional-array

我是Java的初学者,我需要编写一个next()方法,它将从2D数组中返回当前值。

例如,我们可能有:

int[][] values = {{1, 2}, {3, 4}, {5, 6}}; 

当我们第一次使用next()时,会返回1,第二次使用 - 2,第三次使用3等。

我的解决方案是从2D阵列制作一维数组:

 public int[] convert(int[][] array) {

        // At first, count number of all cells to set length for new 1D array.

        int count = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                count++;
            }
        }

        // Now we have length. Creating new array and filling it with data from all arrays.

        int[] result = new int[count];
        int index = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                result[index] = array[i][j];
                index++;
            }
        }
        return result;
    }

然后从新的1D数组中获取值(position是类字段= 0values也是类字段 - int[][] values):

public int next() {
        int[] tmp = convert(values);
        int result = tmp[position];
        position++;
        return result;
    }

但很明显,这种解决方案并不是最好的。有没有办法在没有数组对话的情况下做到这一点?

类似于迭代器next()hasNext()的方法?

更新。我写了一些不好的代码来说明我想要做的事情:

public class ArrayConverter {
    private final int[][] values;
    private int upper = 0;
    private int lower = -1;

    public ArrayConverter(int[][] values) {
        this.values = values;
    }

    public int next() {
        lower++;
        int result = 0;
        try {
            result = values[upper][lower];
        } catch (ArrayIndexOutOfBoundsException a) {
            lower = 0;
            upper++;
            try {
                result = values[upper][lower];
            } catch (ArrayIndexOutOfBoundsException r) {
                upper = 0;
                lower = -1;
                System.out.print("Reached the end of data. Indexes will be zeroed.");
            }
        }
        return result;
    }
}

由于try / catch块,代码很糟糕,我宁愿避免使用它。怎么样?

2 个答案:

答案 0 :(得分:3)

如果您使用List,则可以避免计算元素的数量:

int[][] array = {{1, 2}, {3, 4}, {5, 6}}; 
List<Integer> list = new ArrayList<>();
for (int[] array1 : array) {
    for (int j = 0; j < array1.length; j++) {
        list.add(array1[j]);
    }
}

然后,您可以使用list.get(position);

获取您的值

答案 1 :(得分:0)

正如Mike Tian所说。它可以很快通过Stream API完成:

OfInt iter = Stream.of(a).flatMapToInt(IntStream::of).iterator();

while (iter.hasNext()) {
    iter.nextInt();
}