Java数组:如何确保所用索引的语义正确性?
我有以下情况:Java数组:如何确保所用索引的语义正确性?,java,arrays,correctness,Java,Arrays,Correctness,我有以下情况: 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] = ...
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
}
}
}
原则上,我可以抓住这个错误。但是,以下错误更难捕捉:
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
}
1) 不要捕获
阵列索引超出边界异常
。2) 最好的方法是仔细编写和测试代码。首先,让两个单独的最终变量(常量)具有相同的值是没有意义的。同样要回答这个问题,你需要解释你需要三重嵌套的原因。对我来说,有两个双嵌套循环(每个2D数组一个)然后有三个嵌套更有意义。prashant,关于嵌套,你是对的,但这是我的示例中的一个问题,也许我应该将其减少到最小的示例中,并且根本不显示任何循环!这是因为我所考虑的情况,本质上是当您必须使用索引来访问不同的阵列,但可能被错误地用于错误的阵列。谢谢Jon,我同意您的解决方案,尽管它会影响性能吗?我曾经遇到过这样的情况:Java虚拟机在运行时大部分时间都在创建对象(在本例中,我们将为每个I
创建Foo
对象)。另一个问题:假设我使用新的for
语法(for(Foo-Foo:foos)
)在for
的中的某个点上,我需要foo
的索引I
。有没有一个简单的方法可以做到这一点?(我不喜欢做int I=0;for(Foo-Foo:foos){/*使用I*/I++;}
@Gonzalo:No,如果需要索引,应该使用常规for循环。@Gonzalo:我不相信JVM会创建Foo的新实例;Foo-Foo
只是指向现有Foo[I]的引用(想想指针)
object。因此,堆栈上使用了非常小的内存量,但这是短暂的,不会影响GC之类的东西。@Gonzalo:是的,你最终会得到一个容器对象,而不仅仅是数组。但你几乎肯定不应该关注那个微小的细节——这是微观优化,不应该这样做直到它被证明是相关的。
for (int i = 0; i < foos.length; i++) {
Foo foo = foo[i];
// Use foo
}
for (Foo foo : foos) {
...
}