我有一个二维的整数数组,我正在循环。我想检查我指向的数组元素是否在该数组的范围内。比方说,如果我有一个3x2大小的数组,我希望能够做到这一点:
for(int i=some_variable;i<arrayWidth;i++) {
for (int j=other_variable;j<arrayHeight;j++) {
if (!array[i][j].ISOUTOFBOUNDS) {
// do something
}
}
}
是否有一种雄辩的方法来实现,或者我应该手动检查指数?
PS。 i
和j
也可能是否定的,所以我也想检查一下。
答案 0 :(得分:3)
您可以通过预先计算有效范围来避免执行此比较n²时间:
int maxValidI = Math.min(array.length, arrayWidth);
int maxValidJ = Math.min(array[0].length, arrayHeight);
int minValidI = Math.max(0, some_variable);
int minValidJ = Math.max(0, other_variable);
然后将i和j从minValidI
和minValidJ
迭代到maxValidI
和maxValidJ
。
我希望它会有所帮助。 感谢Andy通知我OP的编辑。
答案 1 :(得分:0)
为什么不直接获取数组的length属性并在if
int arrayWidth = array.length;
for(int i = 0; i < arrayWidth; i++) {
int arraySize = array[i].length;
for (int j = 0; j < arraySize; j++) {
}
}
// or if arrayHeight is from somewhere else
for(int i = 0; i < arrayWidth; i++) {
int arraySize = array[i].length;
for (int j = 0; j < arrayHeight; j++) {
if (arrayHeight <= arraySize) {
// do something
}
}
}
另请注意,array.length是数组的大小,但不保证索引包含非null值。我会使用ArrayList
,因为它包含size()
,这是非空值的大小。
https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#size()
https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList(T...)
答案 2 :(得分:0)
你不能用你写的形式来做,但你可以做一些接近的事情:
if (isInBounds(array,i,j)) { ... }
然后你只需要实现isInbounds
。
如果您愿意,可以使该方法完全通用。例如。以下适用于任何数组或数组数组或......,甚至是非均匀数组(例如,不同大小的数组的数组)。只有赶上它才能在原型类型的数组上工作,因为它被转换为Object[]
。可能需要更多的反思来处理它。
public static boolean isInBounds(Object arrayObj, int...indexes) {
for (int i = 0; i < indexes.length; i++) {
if (arrayObj == null || !arrayObj.getClass().isArray()) {
return false; // we had too many indexes... ended up indexing a leaf element
}
Object[] array = (Object[]) arrayObj;
if (indexes[i] < 0 || indexes[i] >= array.length) {
return false;
}
arrayObj = array[indexes[i]];
}
return true;
}
答案 3 :(得分:0)
我想出了另一种方法。
for(int i=some_variable;i<arrayWidth;i++) {
for (int j=other_variable;j<arrayHeight;j++) {
try {
int tmp=array[i][j];
// do something
} catch (ArrayIndexOutOfBoundsException e) {
continue;
}
}
}
你怎么看待这种方法?它使我们不必预先计算范围,使代码更简单,更容易。