1

だから私は、シングルスペースで区切られた4行の数字である入力テキストファイルを読んでいます。テキストファイルは次のとおりです。

5 
9 6
4 6 8
0 7 1 5

これらの数値を行と呼ばれる 2D 配列に入力したいと思います。したがって、たとえば、2 行目の最初の数字は であるrows[1][0]必要があります。9

私の問題は、スキャナーをin.next()またはに使用するin.nextInt()と、行末を無視してそのまま続行するため、最終的にの代わりにrows[0][1]なることです。そのスロットに番号がない場合、配列に 's の入力を終了させたいと思います。したがって、最初の行は数字のみなので、配列は にしたいのですが、 にしたいと思います。90015rows[0][0]5rows[0][1]rows[0][3]0

try/catch forNoSuchElementExceptionと ifを使用してみましin.hasNextLine()たが、どちらも機能していないようです。

どんなアイデアや助けも大歓迎です。

4

5 に答える 5

5

Scanner を使用して個々のトークンを読み取ることも、 Scanner を使用して行全体を読み取ることもできますが、 Scanner を使用して両方を行うことはできません。

あなたがしたいことは、最初に行を文字列に読み取り、次にその文字列でスキャナーを使用してその行を解析することです。

BufferedReader lineReader = new BufferedReader(...);
String line;

while ((line = lineReader.readLine()) != null) {
    Scanner scanner = new Scanner(line); 
    // use scanner here
}

BufferedReader の代わりに Scanner を使用して行を読み取ることもできますが、特定の要件がない限り (たとえば、既に Scanner を使用しているコードにこれをドロップしようとしている場合など)、行をどのように読み取るかは問題ではありません。 .

それが役立つことを願っています。

于 2013-08-05T22:24:49.473 に答える
3

複数のスキャナーを使用します。1 つの Scanner が で各行をnextLine()取得し、取得した行を次の Scanner にフィードして、各行のトークンを分析します。使用が終わったら、必ず内側のスキャナー (および外側のスキャナー) の close() を行ってください。

擬似コード:

create fileScanner with file
while fileScanner has more lines
  get next line from fileScanner
  create new Scanner with next line, lineScanner
  while lineScanner has next, 
    get next token.
    do what you want with token.
  close of lineScanner
close fileScanner
于 2013-08-05T22:23:45.077 に答える
1

おそらく aBufferedReaderと を使用する必要がありsplitます。これの利点は、splitメソッドが配列を返すため、2 番目の次元で配列をどのくらいの大きさにするかを知っていることlengthです。

public static void main(String[] args) throws Exception {
    final String s = "5\n"
            + "9 6\n"
            + "4 6 8\n"
            + "0 7 1 5";
    final InputStream is = new ByteArrayInputStream(s.getBytes());
    final int[][] array = new int[4][];
    try (final BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
        String line;
        for (int i = 0; (line = br.readLine()) != null; ++i) {
            final String[] tokens = line.split("\\s");
            final int[] parsed = new int[tokens.length];
            for (int j = 0; j < tokens.length; ++j) {
                parsed[j] = Integer.parseInt(tokens[j]);
            }
            array[i] = parsed;
        }
    }
    System.out.println(Arrays.deepToString(array));
}

出力:

[[5], [9, 6], [4, 6, 8], [0, 7, 1, 5]]

while配列は拡張されないため、サイズがわからないループで配列を使用するのは簡単ではありません。を使用すると、実行できなかった過剰な空白でsplit簡単に実行できます。final int[] parsed = new int[tokens.length];Scanner

ただし、最初の次元のサイズはハードコードされていますが、ファイルには常に 4 行あります。

于 2013-08-05T22:31:27.137 に答える
0
Scanner scanner = new Scanner(
            "5\n9 6\n4 6 8\n0 7 1 5");

while (scanner.hasNextLine())
{
    String currentline = scanner.nextLine();

    String[] items = currentline.split(" ");
    int[] intitems = new int[items.length];

    for (int i = 0; i < items.length; i++)
    {
        intitem[i] = Integer.parseInt(items[i]);
    }
}
于 2013-08-05T22:25:34.833 に答える