1

所以我正在阅读一个输入文本文件,它是 4 行单空格分隔的数字。文本文件只是:

5 
9 6
4 6 8
0 7 1 5

我想将这些数字输入到一个称为行的二维数组中。例如,rows[1][0]应该是9,第二行的第一个数字。

我的问题是当我将扫描仪用于in.next()orin.nextInt()时,它会忽略行尾并继续前进,因此rows[0][1]最终会9代替0. 0如果该插槽没有编号,我希望数组完成填充's。因此,由于第一行只有1数字,5所以我希望数组是rows[0][0]5但要是。rows[0][1]rows[0][3]0

我尝试过使用 try/catch forNoSuchElementException和 ifin.hasNextLine()但这些似乎都不起作用。

任何想法或帮助将不胜感激。

4

5 回答 5

5

您可以使用 Scanner 来读取单个令牌,也可以使用 Scanner 来读取整行,但不能同时使用 Scanner 来完成这两种操作。

您要做的是首先将该行读入字符串,然后在该字符串上使用 Scanner 来解析该行,例如:

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

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

您也可以使用 Scanner 而不是 BufferedReader 来读取行,但除非您有特定要求(例如,您试图将其放入已经使用 Scanner 的代码中),否则您如何读取行并不重要.

希望有帮助。

于 2013-08-05T22:24:49.473 回答
3

使用多个扫描仪。一个 Scanner 使用 获取每一行nextLine(),然后将获得的行提供给下一个 Scanner 分析每一行的标记。使用完内部扫描仪(以及外部扫描仪)后,请务必关闭()。

伪代码:

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

您可能应该使用BufferedReaderand split。这样做的好处是您知道在第二维中制作数组有多大,因为该split方法将返回一个数组,您可以检查它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您不知道其大小的循环中使用它们并不容易。Usingsplit允许您简单地使用您无法做到final int[] parsed = new int[tokens.length];Scanner过度空白来执行此操作。

第一个维度大小是硬编码的,但是正如您所说的,您的文件总是有 4 行。

于 2013-08-05T22:31:27.137 回答
1

在每行的末尾,有'\n',并且在每行的第一行(第一行除外),有'\r'。您可以通过它们控制您的文件。

于 2019-11-01T09:21:43.973 回答
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 回答