5

我想逐行解析文本文件的一行中的数字。例如,将 _ 想象成一个空格

我的文本文件内容如下所示:

___34_______45
_12___1000
____4______167
...

我想你明白了。每行可能有可变数量的空格分隔数字,这意味着根本没有模式。最简单的解决方案可以逐个字符地读取并检查它是否是一个数字,然后像这样一直到数字字符串的末尾并解析它。但一定有别的办法。我怎样才能在 Java 中自动读取它,以便我可以进入某个数据结构,比如数组

[34,45]
[12,1000]
[4,167]
4

3 回答 3

11

使用java.util.Scanner. 它有nextInt()方法,它完全符合您的要求。我认为您必须“手动”将它们放入数组中。

import java.util.Scanner;
public class A {
  public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int v1 = in.nextInt(); //34
    int v2 = in.nextInt(); //45
    ...
  }
}
于 2012-09-17T02:55:49.703 回答
4

如果您只需要数据结构中的数字,例如平面数组,那么您可以使用Scanner一个简单的循环读取文件。Scanner使用空格作为默认分隔符,跳过多个空格。

给定List ints

Scanner scan = new Scanner(file); // or pass an InputStream, String
while (scan.hasNext())
{
    ints.add(scan.nextInt());
    // ...

您需要处理Scanner.nextInt.

但是您建议的输出数据结构使用多个数组,每行一个。您可以使用来读取文件Scanner.nextLine()以获取单独的行作为String. 然后使用String.split正则表达式拆分空格:

Scanner scan = new Scanner(file); // or InputStream
String line;
String[] strs;    
while (scan.hasNextLine())
{
    line = scan.nextLine();

    // trim so that we get rid of leading whitespace, which will end
    //    up in strs as an empty string
    strs = line.trim().split("\\s+");

    // convert strs to ints
}

您还可以使用一秒钟Scanner来标记内部循环中的每一行。Scanner将为您丢弃任何前导空格,因此您可以省略trim.

于 2012-09-17T02:55:47.453 回答
1

BufferedReader用和 String 的split()功能把它搞砸了:

BufferedReader in = null;
try {
    in = new BufferedReader(new FileReader(inputFile));
    String line;
    while ((line = in.readLine()) != null) {
        String[] inputLine = line.split("\\s+");
        // do something with your input array
    }
} catch (Exception e) {
    // error logging
} finally {
    if (in != null) {
        try {
            in.close();
        } catch (Exception ignored) {}
    }
}

(如果您使用的是 Java 7,finally那么如果您使用 try-with-resources,则不需要该块。)

这会将______45___23(其中 _ 是空格)之类的内容更改为 array ["45", "23"]。如果您需要将它们作为整数,编写一个将 String 数组转换为 int 数组的函数非常简单:

public int[] convert(String[] s) {
    int[] out = new int[s.length];
    for (int i=0; i < out.length; i++) {
        out[i] = Integer.parseInt(s[i]);
    }
    return out;
}
于 2012-09-17T03:03:21.690 回答