0

我有一个字符串

String word = "FrenciusLeonardusNaibaho";

当我试图制作这样的矩阵时:

char matriks[][] = new char[16][16];
    int k = 0;

    for (int i = 1; i < 16; i++) {
        for (int j = 1; j < 16; j++) {
            matriks[i][j] = word.charAt(k);
            k++;
        }
    }

我收到了这个错误

String index out of range: 24

我怎样才能做到这一点?谢谢..

4

6 回答 6

4

超出word了at的末尾word.charAt(k);。基本上你没有足够的字母来填充你的矩阵。

你可以做这样的事情

if(k >= word.length())
   break;

在内循环下方。或者您可以使用此条件将元素初始化为某个默认值。

此外,正如其他人所提到的,i,j 应该从 0 开始,除非您有充分的理由从 1 开始。

于 2013-01-11T05:00:24.133 回答
1
char matriks[][] = new char[16][16];
int k = 0;

for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 16; j++) {
        matriks[i][j] = word.charAt(k%word.length());
        k++;
    }
}

所以它可以从头到尾,然后重新启动。

于 2013-01-11T05:11:11.263 回答
0

您正在填充 16x16 数组并迭代循环 16x16 次,但您的字长小于 16x16。因此,当 k 等于字长时进行检查,然后终止循环。像这样更改代码。

char matriks[][] = new char[16][16];
int k = 0;

for (int i = 1; i < 16; i++) {
    for (int j = 1; j < 16; j++) {
        if(k >=word.length)
            break;
        matriks[i][j] = word.charAt(k);
        k++;
    }
}   
于 2013-01-11T05:42:34.547 回答
0

尝试添加

if(k >= word.length())
    k = 0;

对于您的内部 for 循环,这将继续从单词的开头填充数组。

于 2013-01-11T05:09:20.863 回答
0

当您尝试在数组、列表、字符串或范围超出其边界的任何内容中读取或写入时,会发生“超出范围”或“超出范围”。当您的字符串仅包含 7 个字符时,您无法读取索引 8 处的字符。这不是你的字符串的 RAM,它会导致 RAM 损坏,就像它有时在 C 数组中发生的那样。

当您设置数组和 for 循环时,请尝试使用容器的大小或长度函数检查您是否仍在字符串的范围内。在字符串的特殊情况下,它是length.

我认为您正在尝试拆分存储在字符串中的名称列表。在这种情况下,创建动态容器会更容易,例如 list ( http://www.easywayserver.com/blog/java-list-example/)。

这里我有一个小例子。出于这些目的,我更喜欢 while 循环。如果我至少在运行时知道列表的长度而不解释数据,那么 for 循环是一个不错的选择,但不是这样:

String names = "Foo Bar";
List<String> seperatedNames = new List<String>();
String name = "";
int i = 0;
while (i < names.length()) {
    if (names.charAt(i) == ' ') { // you can check for upper case char too
        seperatedNames.add(name); // add name to list
        name = ""; // clear name-buffer
        i++; // increment i, else it would produce an infinite loop
    }
    name += names.charAt(i++); // add current char to name-buffer and increment current char
}

我希望我能帮上一点忙。

于 2013-01-11T05:24:16.927 回答
0

当然,你肯定会得到这个错误,因为你的单词中的字符只有 24 个字符。

为避免这种情况,您需要检查单词的长度并需要打破所有循环。

试试这个代码。

char matriks[][] = new char[16][16];
int k = 0;
int lenght = word.length();
outerloop:

for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 16; j++) {
        matriks[i][j] = word.charAt(k);
        k++;
        if(k >= lenght){
            break outerloop;
        }
    }
}
于 2013-01-11T05:33:31.563 回答