试图解析int string string char int的输入

时间:2014-12-03 22:20:14

标签: java input

好的,所以我想从文件中读取内容。它们看起来像这样:

70          Fresno Credit Bureau             Fresno           CA          93714

我希望它成为碎片,70个进入int,Fresno Credit Bureau和Fresno进入单独的字符串,状态首字母变成单独的字符,最后将最后一个邮政编码提供给另一个int。 / p>

我试图使用Scanner零碎地阅读它,并且我试图将它作为字符串缓冲区读取并且无论如何都没有骰子。

while(gre.hasNextLine()){
            imidate = gre.nextInt();
            gre.skip(" ");
            han = gre.next();
            gre.skip(" ");
            luke = gre.next();
            gre.skip(" ");
            bok = gre.next().charAt(0);
            mander = gre.next().charAt(1);
            gre.skip(" ");
            imate = gre.nextInt();
            theTree.addNode(imate, han, luke, bok, mander, imidate);
        }

从某种情况来看,这可能会搞砸到某个地方的解析,但是我不知道在哪里。有什么建议?评论?顾虑?

3 个答案:

答案 0 :(得分:1)

看起来你想在字符串中允许空格,将2+空格视为分隔符。为此,您需要为Scanner的分隔符设置适当的模式:

Scanner gre = ...
gre.useDelimiter("\\s{2,}");

现在,对next的调用将忽​​略Fresno Credit Bureau内的空格,仅在两个或更多空格处打破。

这也可以让您摆脱skip来电,因为Scanner会跳过分隔符。

Demo.

最后,这段代码看起来很可疑:

bok = gre.next().charAt(0);
mander = gre.next().charAt(1);

如果您尝试获取同一令牌的第一个和第二个字符,请在调用String之前将其存储在charAt()中。否则,您将访问两个不同令牌的字符:

String tok = gre.next();
bok = tok.charAt(0);
mander = tok.charAt(1);

答案 1 :(得分:0)

将该行拆分为String [],然后您可以将String数组的元素放入变量中。

喜欢:

String[] line = gre.split("\\s+");
imidate = Integer.parseInt(line[0]);
han = line[1];
etc ...

答案 2 :(得分:0)

由于每一行都包含不同类型的对象,因此您应该有一个类来处理它。例如,

class MyObject {
    int    number;
    String name;
    String city;
    char[] state;
    int    zip;

    public static MyObject fromLine(String line) {
       String[] columns = line.split("\\s{2,}");
       number = Integer.parseInt(columns[0]);
       name   = columns[1];
       city   = columns[2];
       state  = columns[3].toCharArray();
       zip    = Integer.parseInt(columns[4]);
    }
}

如果文件中的每一行看起来与问题中的一行相似,则可以使用扫描仪或BufferedReader逐行读取文件,然后分别处理每行的处理。使用BufferedReader,您可以执行以下操作:

try (BufferedReader reader = new BufferedReader(new FileReader(vocabulary))) {
        List<MyObject> myObjects = reader.lines()
                                         .map(MyObject::fromLine)
                                         .collect(Collectors.toList());
} catch (IOException e) { }

如果您使用的是标签,请使用"\\t+"代替"\\s{2,}"