【问题标题】:Why do the values of the array change after reading a line?为什么读取一行后数组的值会发生变化?
【发布时间】:2017-10-16 20:33:06
【问题描述】:
 BufferedReader in = new BufferedReader(new FileReader(file));
 String line;
 int[] data = null;

 while((line = in.readLine()) != null) {
    String[] a = line.split(","); //read in all numbers in file
    data = new int[a.length]; //convert those numbers from Strings to ints
    for(int i = 0; i < a.length; i++) {
        data[i] = Integer.parseInt(a[i]);
        System.out.print(data[i] + ","); //testing
    }
 }

 System.out.println();
 for(int i = 0; i < data.length; i++) {

        System.out.print(data[i] + ",");
 }

一个文件只包含 1 行以逗号分隔的数字,例如:

5,4,
1,-1,-1,1,1,
1,0,3,4,1,
1,0,2,2,1,
1,1,1,1,1,

程序创建一个只包含数字的字符串数组,然后以相同的顺序创建一个整数数组。但是将字符串更改为 int,然后验证 int 数组是否包含文件中的值,打印出 int 数组。

此代码输出:

5,4,1,-1,-1,1,1,1,0,3,4,1,1,0,2,2,1,1,1,1,1,1,
1,1,1,1,1,

如您所见,第一行数字对应于 while 块内的打印函数,可以正确打印。但是当数组在while块外再次迭代打印出来的时候,突然就完全不一样了,为什么会这样呢?数组在 while 块之外应该是相同的。

【问题讨论】:

  • 请确认您的文件内容。在我看来,好像您在单独的行上有一个换行符 1,1,1,1,1。这将导致问题,因为data 会在读取每一行时重新初始化。
  • 5,4, 1,-1,-1,1,1, 1,0,3,4,1, 1,0,2,2,1, 1,1,1, 1,1,
  • 如果内容正是您刚刚发布的内容,您将获得NumberFormatException。我已经尝试过您的代码,它适用于格式正确的文本文件(单行,没有额外的空格)。

标签: java arrays file


【解决方案1】:

试图编辑你的问题,我看到你粘贴了:

5,4,
1,-1,-1,1,1,
1,0,3,4,1,
1,0,2,2,1,
1,1,1,1,1,

所以,我可以想象你的文件是这样的。

如果你执行这段代码:

BufferedReader in = new BufferedReader(new FileReader("Path_to/java.txt"));
        String line;
        int[] data = null;

        while((line = in.readLine()) != null) {
            String[] a = line.split(","); //read in all numbers in file
            data = new int[a.length]; //convert those numbers from Strings to ints
            System.out.println("1data.length: " + data.length);
            for(int i = 0; i < a.length; i++) {
                data[i] = Integer.parseInt(a[i]);
                System.out.println(data[i] + ","); //testing
            }
        }

        System.out.println("data.length: " + data.length);
        for(int i = 0; i < data.length; i++) {

            System.out.print(data[i] + ",");
        }

    }

您可以看到 data.length 最后是 5(原因很明显)。这就是为什么在

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

        System.out.print(data[i] + ",");
 }

你看

1,1,1,1,1,

【讨论】:

  • 是的,我想我现在明白了,在记事本上它看起来像 1 行文本,但显然有多行(你可以在 stackoverflow 上看到一个额外的空间,表示新行?)
  • @ApprentlyOk 乐于助人。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受:stackoverflow.com/help/someone-answers
【解决方案2】:

在测试您的代码后,我发现它可以与格式正确的文本文件一起正常工作。正确格式化为单行,逗号分隔的整数,没有额外的空白。

您的程序的有效文本文件示例:

5,4,1,-1,-1,1,1,1,0,3,4,1,1,0,2,2,1,1,1,1,1,1

如果您的文件中有换行符,则数组data 将使用等于当前分割行长度的新数组重新初始化。因此,data 将只包含读取的最后一行。

我建议使用List 作为更好的解决方案,因为整数的数量可能未知,而Scanner 使用分隔符“,”来读取文本文件。此外,在“扫描”文本文件的同时,删除所有额外的空格,以防止在使用Integer.valueOf() 时出现NumberFormatException,如果存在任何空格。这种方法将能够读取格式较差的文本文件。注意,如果文件不只包含整数,这仍然会导致异常。

例如:

String fileName = "test.txt";
Scanner scanner = new Scanner(new File(fileName));
scanner.useDelimiter(",");
List<Integer> result = new ArrayList<>();
while (scanner.hasNext()) {
    // add the parsed integer to the list, removing split space.
    result.add(Integer.valueOf(scanner.next().replaceAll("\\s+", "")));
}

// Display contents
String output = "";
for (int value : result) {
    if (!output.isEmpty()) {
        output += ", ";
    }
    output += value;
}
System.out.println(output);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2021-05-05
    相关资源
    最近更新 更多