0

そのため、String index out of range は、コレクションの範囲を超えていることを意味しますが、自分のコードでそれをどのように行っているのかよくわかりません。

このコードは、3 つの int (最初の 2 つはそれぞれ行数と列数としてこれに関連するものです) と一連の文字を含むテキスト ファイルから読み取ることになっています。最初に最初の 3 つの数値を読み取って保存し、次にファイルの残りを文字列に変換します。次に、テキスト ファイルのサイズで char の配列を設定し、これらの値にテキスト ファイルの文字を 1 文字ずつ入力することで、これを追跡します。

ただし、コードを印刷しようとすると、文字列インデックスが範囲外というエラーが発生し、問題を見つけることができません。

これはコードです:

  import java.util.*;  
  import java.io.*;

public class SnakeBox {
// instance variables
  private char[][] box;
  private int snakeCount;
  private int startRow, startCol;
  private int endRow, endCol;
    private int rows, cols, snakes;
  Scanner keyboard = new Scanner(System.in);

/** Create and initialize a SnakeBox by reading a file.
    @param filename the external name of a plain text file
*/
  public SnakeBox(String fileName) throws IOException{
     Scanner infile = new Scanner(new FileReader(fileName));


     int count = 0;
     String s = "";
     rows = infile.nextInt();
     cols = infile.nextInt();
     snakes = infile.nextInt();
        infile.nextLine();
     box = new char[rows][cols];
     while (infile.hasNext()) {
        s += infile.next();
     }
     for (int i = 0; i < rows; i++) {

        for (int j = 0; j < cols; j++) {
           count++;
           char c = s.charAt(count);           
           box [i][j] = c;
        }
     }
  } 

テキストファイルは次のとおりです。

    16 21 4
+++++++++++++++++++++
+                   +
+         SSSSS     +
+    S   S          +
+    S    SS        +
+    S      S       +
+ S  S       SS     +
+  SS  S            +
+     S             +
+    S  SSSSSS      +
+   S         S     +
+  S           S    +
+ S     SSS   S     +
+      S     S      +
+       SSSSS       +
+++++++++++++++++++++

ありがとうございました。

4

2 に答える 2

6

変化する

count++;
char c = s.charAt(count);  

char c = s.charAt(count);   
count++;

編集: 別の問題は、 Scanner.next() が次のトークンを返し、すべてのスペースを無視することです。Achintya Jha の回答を参照してください

于 2013-04-05T09:05:35.807 に答える
2

問題は上記の内容ではありません。指定されたファイルには、合計 117 文字に相当する 59 個近くのトークンがあります (手動で数えました)。count の最大値は 21*16 =336 に達します。

「infile.dat」という名前の入力ファイルが次の形式の場合:

こんにちは 1234
CS学生 さようなら 6556

次のコードを使用して読み取ることができる 6 つのトークンがあります。

while (filein.hasNext()) {      // while there is another token to read
    String s = filein.next();   // reads in the String tokens "Hello" "CSstudents" 
    String r = filein.next();   // reads in the String tokens "There" "goodbye"
    int x = filein.nextInt();   // reads in the int tokens 1234  6556 

}

Scanner オブジェクトがすべての空白文字を次のトークンの先頭までスキップする方法に注意してください。したがって、私の提案は、Scanner#hasNextLine() と Scanner#nextLine()を使用することです

while (infile.hasNextLine) {
    s += infile.nextLine();
}
于 2013-04-05T09:19:03.697 に答える