我有以下情况:
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
情况)?
谢谢!
答案 0 :(得分:2)
听起来你真的应该更好地封装你的数据。每当你有两个总是相同大小的集合时,请考虑更改为具有组成它们的某种类型的一个集合。
我们无法确切地告诉你的类型是什么意思(提示:使用更有意义的名字)但是如果你有一个类:
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) {
...
}