1

``我是 Java 新手。我想要做的就是将 A 到 Z 存储在这样的二维数组中

ABCDE

FGHIJ

荷兰皇家航空公司

PQRST

紫外线WXY

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 并将其余字符保留为空。可能吗 ??

4

4 回答 4

1

您的循环正在尝试填充整个网格(30 个空格)。当它用完字母 (26) 时,你会得到一个越界异常。我想最容易做的事情是

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

alpha 数组的大小为 26,因此 alpha 的最大索引为 25。但您的 2d 数组共有 30 个元素。所以在你的 for 循环中会有 k 值大于 25 的迭代。

于 2014-09-14T12:43:00.233 回答
1

填完最后一个字母后,可以使用 break 退出循环。

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];
   }
}

您还可以使用每行中列数不同的数组(最后一行只有一列)。

于 2014-09-14T12:45:06.373 回答
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 回答