Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 寻找更新多维数组的有效方法_Java_Arrays_Eclipse_For Loop_Multidimensional Array - Fatal编程技术网

Java 寻找更新多维数组的有效方法

Java 寻找更新多维数组的有效方法,java,arrays,eclipse,for-loop,multidimensional-array,Java,Arrays,Eclipse,For Loop,Multidimensional Array,我更新多维数组(Y[I][t][k])的值。由于更新需要经过多次迭代,因此这部分代码的运行时非常重要。我想知道是否有人知道如何以更有效的方式来做这件事 下面是需要更新的部分 double [][][] Y=new double [a.length][b.length][c.length]; for(int i=0;i<a.length;i++){ for(int j=0;j<b;j++){ for (int k=0; k<c.length; k++){ if(i=

我更新多维数组(Y[I][t][k])的值。由于更新需要经过多次迭代,因此这部分代码的运行时非常重要。我想知道是否有人知道如何以更有效的方式来做这件事

下面是需要更新的部分

double [][][] Y=new double [a.length][b.length][c.length];
for(int i=0;i<a.length;i++){
 for(int j=0;j<b;j++){
  for (int k=0; k<c.length; k++){
    if(i==w && j==r && k==u){// w, r and u can have any value.
      Y[i][j][k]=g;
     }else{
      Y[i][j][k]=f; 
     }
    }
  }
}

您正在设置多维数组区域的每个元素,成本与设置的元素数成比例,因此没有理由认为您可以渐进地做得更好。然而,通过使用批量操作方法,并通过在循环之外处理特殊情况,而不是在每次迭代中对其进行测试,您可能会获得一些速度提高。比如说,

for (int i = 0; i < a.length; i++) {
    for (int j = 0; j < b.length; j++) {
        Arrays.fill(Y[i][j], 0, c.length, f);
    }
}

if (c.length > 10) {
    Y[0][0][10] = g;
}

如果expression
f
不满足上述要求,那么您所能做的最好的事情就是将特例从循环中取出,而不改变任何其他内容。对于某些表达式
f
和/或
g
,即使这样也可能不可能,因为它可能产生不等价的结果。例如,在这种情况下,一个或两个元素以某种相关方式是有状态的,例如通过在计数器上关闭。

正如我从您的代码中理解的那样,您的目标是将Y[0][0][10]设置为g,将其他元素设置为f

那么,忘掉疯狂的循环,像下面的代码那样做怎么样

Arrays.fill(Y, f);

Y[0][0][10] = g;

变量
Y
的数据类型是什么?变量
g
f
以及
a
b
c
的数据类型是什么?请使用更完整的示例程序更新您的帖子。最小的更改是在most内部循环中删除
if
语句,只需在整个数组中迭代,将元素设置为
f
,然后设置
Y[0][0][10]
g
c.长度应大于10。去掉if语句可能会有很大的不同,除非java编译器为您提供了它。我会检查两种方式,看看是否有时差。如果“b为int”,什么是
b.length
?感谢您的观察。正确的。它是“b”而不是“b.length”。人们可能会使用
Arrays.fill()
,但是如果
f
的类型对于
Y[i][j][k]
的赋值是正确的,那么几乎可以肯定使用
数组是不正确的。fill(Y,f)
。如果
c.length
小于或等于10怎么办?
for (int i = 0; i < a.length; i++) {
    Arrays.fill(Y[i][0], 0, c.length, f);
    for (int j = 1; j < b.length; j++) {
        System.arraycopy(Y[i][0], 0, Y[i][j], 0, c.length);
    }
}

if (c.length > 10) {
    Y[0][0][10] = g;
}
Arrays.fill(Y, f);

Y[0][0][10] = g;