1

「私は Java の初心者です。私がやりたいのは、このような2D配列内にAからZを格納することだけです

ABCDE

FGHIJ

KLMNO

PQRST

UVWXY

Z

String alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 char[] alpha = alphabets.toCharArray;
 int k=0;
 char[][] cipher = new char[6][5];
 for(int i= 0;i<6;i++)
     {
       for(int j=0;j<5;j++)
           {
             cipher[i][j] = alpha[k];
             k++;
            }
     } 

しかし、これはArrayIndexOutOfBounds例外をスローします。配列に26を入力し、残りの文字をnullのままにしておきます。出来ますか ??

4

4 に答える 4

1

Java 8 では、この種の操作に Stream を使用して、適切なソリューション (いわゆる「ワンライナー」) を取得できます。

IntStream.range('A', 'Z' + 1).forEach(c -> cipher[(c - 'A') / chipher[0].length][(c - 'A') % cipher[0].length] = (char)c);

Java 8 より前は、単純な for ループで目標を達成できました。

for (int i = 'A'; i < 'Z' + 1; i++) {
    cipher[(i - 'A') / cipher[0].length][(i - 'A') % cipher[0].length] = (char)i;
}
于 2014-09-14T13:03:05.390 に答える
1

最後の文字を入力した後、ブレークを使用してループを終了できます。

String alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] alpha = alphabets.toCharArray();
char[][] cipher = new char[6][5];
outerLoop : for(int i=0 ; i<cipher.length ; i++) {
   for(int j=0 ; j<cipher[0].length ; j++) {
       int k = i*cipher[0].length + j;
       if (k >= alpha.length) break outerLoop;
       cipher[i][j] = alpha[k];
   }
}

各行の列数が同じではない配列を使用することもできます (最後の行には 1 つの列しかありません)。

于 2014-09-14T12:45:06.373 に答える
1

ループはグリッド全体 (30 スペース) を埋めようとしています。文字数 (26) がなくなると、範囲外の例外が発生します。私が推測する最も簡単なことは

cipher[i][j] = alpha[k];
k++;
if (k >= alpha.length) {
    break;
}
于 2014-09-14T12:42:38.517 に答える
1

the size of the alpha array is 26 so the max index of alpha is 25. but your 2d array has total 30 elements. so in your for loop there will be iteration where k value is greater than 25.

于 2014-09-14T12:43:00.233 に答える