11

ゼロにリセットしたい 3 次元配列があります。forこれを行うには、3 つのループを含まない簡単な方法があるはずです。

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        for (int k = 0; k < n; k++) {
            cube[i][j][k] = 0;
        }
    }
}
4

8 に答える 8

29

JDK 1.5 以降を使用している場合:

    for (int[][] square : cube) {
        for (int[] line : square) {
            Arrays.fill(line, 0);
        }
    }
于 2009-05-14T14:23:15.220 に答える
14

配列は初期化後にゼロで埋められます:

int[][][] cube = new int[10][20][30];

これは後で行うこともできます。配列をゼロにリセットするには、宣言に限定されません。

cube = new int[10][20][30];

新しい配列を作成するだけで、ゼロで初期化されます。これは、配列への参照を保持している場所が 1 つある場合に機能します。ガベージ コレクションされる古い配列は気にしないでください。

言語のこの動作に依存したくない場合、または古い配列への参照のすべての出現を置き換えることができない場合は、jjnguy が述べたようにArrays.fill()を使用する必要があります。

for (int i = 0; i < cube.length; i++)
{
   for (int j = 0; j < cube[i].length; j++)
   {
      Arrays.fill(cube[i][j], 0);
   }
}

Arrays.fill も内部でループを使用しているようですが、全体的によりエレガントに見えます。

于 2009-05-14T14:07:41.530 に答える
13

古い配列を破棄して、新しい配列を作成することもできるようです。

int size = 10;
cube = new int[size][size][size];
于 2009-05-14T14:09:25.253 に答える
5
for (int i = 0; i < arr.length; i++){
    for (int j = 0; j < arr[i].length){
        Arrays.fill(arr[i][j], 0);
    }
}

そうすれば、 Arrays.fillを使用して 1 つの余分なループを取り除くことができます。

または

arr = new double[arr.length][arr[0].length][arr[0][0].length];

残念ながら、これは配列が少なくともlength >= 1.

于 2009-05-14T14:08:08.127 に答える
2

まあ、あなたはいつでもこれを行うことができます:

Arrays.fill(cube[0][0],0);
Arrays.fill(cube[0],cube[0][0]);
Arrays.fill(cube,cube[0]);

3ループより少しきれいです。

わからない場合は、最初の「塗りつぶし」で1つのディメンションを塗りつぶします。2番目の塗りつぶしは、その1つの次元を2つの次元にコピーします。3番目の塗りつぶしは、2つの次元を3つの次元にコピーします。

保存する必要のある配列への参照が他にない場合は、他の人が提案しているように配列を再作成する方が、おそらく高速でクリーンです。

于 2009-05-14T16:40:17.840 に答える
2

それが3D 配列であるという事実にもかかわらず、最も読みやすいソリューションが最善であることがよくあります (最善とは主観的な言葉であり、いくつかのプロパティに関して最善と言うべきであり、読みやすさは通常私の最初の選択です)。

内側のループに要素が 3 つしかなく、列が 3 つあることを強調したい場合は、次のようにします。

for (int i = 0; i < n; i++) { 
    for (int j = 0; j < n; j++) { 
        cube[i][j][0] = 0; 
        cube[i][j][1] = 0; 
        cube[i][j][2] = 0; 
    }
}
于 2009-05-14T14:13:16.540 に答える
1

int 要素のデフォルト値がゼロであるため、すべての行が同じ長さの場合は、配列を破棄して新しい配列を作成できます。

cube = new int[cube.length][cube[0].length][cube[0][0].length];

または、あなたができる

for(int[][] tda : cube ) {
  for(int[] oda : tda) {
    java.util.Arrays.fill(oda, 0);
  }
}
于 2009-05-14T14:16:39.277 に答える