java:检查数组[i] [j]是否在bounds内

时间:2015-05-28 18:06:05

标签: java arrays

我有一个二维的整数数组,我正在循环。我想检查我指向的数组元素是否在该数组的范围内。比方说,如果我有一个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。 ij也可能是否定的,所以我也想检查一下。

4 个答案:

答案 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从minValidIminValidJ迭代到maxValidImaxValidJ

我希望它会有所帮助。 感谢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;
        }
    }
}
你怎么看待这种方法?它使我们不必预先计算范围,使代码更简单,更容易。