我有以下情况:
final int I = 10;
final int MU = 100;
final int P = 100;
int[][] a = new int[I][MU];
int[][] b = new int[I][P];
for(int i = 0; i < I; i++) {
for(int mu = 0; mu < MU; mu++) {
for(int p = 0; p < P; p++) {
a[i][mu] = ... // something
b[i][p] = ... // something
}
}
}
正如您所看到的,我使用了多个具有相同维度但运行在不同索引上的数组。在此代码中,以下错误可能会导致ArrayIndexOutOfBoundsException
,自 mu
范围大于 i
:
a[mu][i] = ...
原则上我可以捕获这个错误。但是,以下错误更难捕获:
b[i][mu] = ...
这里不会出现运行时异常,因为 mu
与 p
具有相同的范围。不过,这个错误确实会导致代码中出现语义问题。
最后,我的问题是:以数组 a
的方式对这些数组进行编程的最佳方法是什么?只能使用正确的索引进行访问(在本例中为 i
和 mu
)?
谢谢!
最佳答案
听起来您确实应该更好地封装数据。每当您有两个大小始终相同的集合时,请考虑更改为由一个组成它们的某种类型的集合。
我们无法真正判断您的类型代表什么(提示:使用更有意义的名称),但如果您有一个类:
class Foo {
private final int[] a = new int[MU];
private final int[] b = new int[P];
...
}
那么你可以:
Foo[] foos = new Foo[I];
此时数组的结构非常清楚 - 你不太可能做错事,因为你会有一个循环,例如:
for (int i = 0; i < foos.length; i++) {
Foo foo = foo[i];
// Use foo
}
我还鼓励您使用增强的 for 循环:
for (Foo foo : foos) {
...
}
关于Java 数组 : how to ensure the semantic correctness of indexes used?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15795829/