1

我正在尝试从文件中读取字符串,提取单个字符并使用这些字符填充 2D 字符数组。到目前为止,除了填充数组之外,我已经能够做所有事情。我在线程“main”java.lang.ArrayIndexOutOfBoundsException 中不断收到异常:错误消息。任何帮助,将不胜感激。这是我第一次使用二维数组。谢谢。这是test.txt的内容。每个单词换行。前 2 个整数是数组 4 4 FILE WITH SOME INFO 的维度

public class acsiiArt 
{

public static void main(String[] args) throws IOException
{
File file = new File("test.txt");
Scanner inputFile = new Scanner(file);
int x = inputFile.nextInt(); 
int y = inputFile.nextInt(); 
while (inputFile.hasNext())
{ 
char [][] array = new char [x][y];

   //char c = words.charAt(i);  
    for (int row =0; row<x;row++)
    {
        for (int col =0; col<y;col++)
        {
            String words = inputFile.nextLine();
            for (int i=0; i<words.length(); i++)

            array[x][y]=words.charAt(i);
        }
    }
}

}   
 }
4

4 回答 4

0
for (int row =0; row<x;row++)
{
    for (int col =0; col<y;col++)
    {
        String words = inputFile.nextLine();
        for (int i=0; i<words.length(); i++)

        array[x][y]=words.charAt(i);
    }
}

中的索引总数arrayx * y。下面,您正在填写所有可能的索引

for (int row =0; row<x;row++)
{
    for (int col =0; col<y;col++)

所以当你添加这个时:

for (int i=0; i<words.length(); i++)

你乘以另一个因素words.length。所以你需要x * y * words.length一些索引,但你只有x * y. 这就是为什么你得到ArrayIndexOutOfBoudsException

于 2013-10-29T04:57:56.400 回答
0

ArrayIndexOutOfBoundsException意味着您正在使用超出其限制的数组。所以在你的情况下:

char [][] array = new char [x][y];
//char c = words.charAt(i);  
for (int row =0; row<x;row++) {
    for (int col =0; col<y;col++){
        String words = inputFile.nextLine();
        for (int i=0; i<words.length(); i++)
           array[x][y]=words.charAt(i);
    }
}

问题可能是因为您的数组大小小于 input words。问题是因为您放置了额外的循环,而您的循环本身不正确。请看下面的代码。
所以你可以做两件事。

  1. 更改值y足够大​​,以便任何单词字符串都可以存储。
  2. 而不是循环单词的大小,你可以循环你的数组大小。

.

for (int row =0; row<x;row++) {   
    String words = inputFile.nextLine();
    int size = Math.min(words.length(),y);
    for (int i=0; i< size; i++)
         array[row][i]=words.charAt(i);
 }
于 2013-10-29T04:58:33.573 回答
0

最简单的方法是使用ArrayList<char[]>. 您所要做的就是char[]为每个新行添加一个新的读取:

ArrayList<char[]> chars = new ArrayList<>();
while (inputFile.hasNext()){
    chars.add(inputFile.nextLine().toCharArray());
}
char[][] array = chars.toArray(new char[chars.size()][]);

AnArrayList基本上是一个可变大小的数组。此代码获取文件中的每一行,将其转换为char[],然后将其添加到ArrayList. 最后,它将 转换ArrayList<char[]>char[][].

如果您不能或不想使用ArrayList,您可以随时这样做:

char[][] array = new char[1][];
int a = 0;
while(inputFile.hasNext()){
    //read line and convert to char[]; store it.
    array[a] = inputFile.nextLine().toCharArray();

    //if there are more lines, increment the size of the array.
    if (inputFile.hasNext()){
        //create a clone array of the same length.
        char[][] clone = new char[array.length][];
        //copy elements from the array to the clone. Note that this can be 
        //done by index with a for loop
        System.arraycopy(array, 0, clone, 0, array.length);
        //make array a new array with an extra char[]
        array = new char[array.length + 1][];
        //copy elements back.
        System.arraycopy(clone, 0, array, 0, clone.length);
        a++;
    }
}

如果您事先知道数组的尺寸:

char[][] array = new char[dimension_1][];
int a = 0;
while (inputFile.hasNext()){
    array[a] = inputFile.nextLine().toCharArray();
    a++; //don't need to check if we need to add a new char[]
}

回应评论:

我们知道 achar[][]不能打印Arrays.toString()(如果我们想要内容),因为我们会得到很多char[].toString(). 但是,char[][]可以使用以下方法之一打印 a:

public static String toString(char[][] array){
    String toReturn = "[\n";
    for (char[] cArray: array){
        for (char c: cArray){
            toReturn += c + ",";
        }
        toReturn += "\n";
    }
    return toReturn + "]";
}

我个人更喜欢这个(需要import java.util.Arrays):

public static String toString(char[][] array){
    String toReturn = "[\n";
    for (char[] cArray: array){
        toReturn += Arrays.toString(cArray) + "\n";
    }
    return toReturn + "]";
}
于 2013-10-29T05:25:03.310 回答
0

我见过这样的问题,我假设x并被y初始化为前两个字符,它们代表行数和列数。如果是这种情况,则for (int i=0; i<words.length(); i++)不需要第三个 for 循环。此时您可以只引用col该单词的变量,因为它应该表示有多少个字符。

所有这些仅适用于字符为矩形模式的情况,这意味着每行中的列数相同。否则,IndexOutOfBoundsError只要其中一行比最初给出的列值短,您就会得到一个。

编辑:如果你最终的二维字符数组不是矩形的,而是“锯齿状的”,则需要不同的实现。我建议使用 2d arrayList(arrayLists 的 arrayList)。

或者您可以使用第三个 for 循环来保留当前的实现,但您必须确保原始x值代表最长的行/最多的列,然后您就可以使用words.length. 您还必须对具有 length>x空格的行的额外部分初始化为null.

于 2013-10-29T04:52:00.010 回答