我是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
是类字段= 0
,values
也是类字段 - 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块,代码很糟糕,我宁愿避免使用它。怎么样?
答案 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();
}