2013-05-08 40 views
1

我试图读取由单个项目和回车之间的空格分隔的文件中的值。在Java中使用扫描仪来解析文本文件或控制台输入,并遇到错误

所以文本文件是一样的东西

1 lunch box 3.99 
2 jelly donuts 1.99 
4 cases of beer 36.99 
2 chess boards 24.99 

有了这些值我试图构造对象......那么该对象将被弥补了数量,上线的第一件事,一个名字 - 线上的第二件事,价格是线上的最后一件事。所以构造是这样的:

product(int x, String name, float price) { 
this.x = x; 
this.name = name; 
this.price = price; 
} 

我的问题是我已经编写了扫描仪正在运行陷入困境试图解析一切,当的方式。所以我收到一个java.util.InputMismatchException。如果我使用类似的算法:

if (scannerRef.hasNextInt()) 
    arraylistRef.intThing = scannerRef.nextInt(); 

if (scannerRef.hasNext()) 
    arraylistRef.name = scannerRef.next(); 

if (scannerRef.hasNextFloat()) 
    arrayListRef.price = scannerRef.nextFloat(); 

那么代码的方式,我把它放在每个单独的原始或字符串在自己的对象,而不是通过整条生产线循环,然后将它添加到一个对象

我的希望这是有道理的。感谢您阅读,如果你现在正在阅读。

我所关心的代码的主要部分是这样的: 我在这里用上述类型的算法注释掉了所有内容到同一个对象,但运行到java.util.InputMismatchException游戏中

// loop while there is text to read 
while (s1.hasNextLine()) { 
    Product p = new Product(p.quantity = s1.next); 
    //if (s1.hasNextInt()) 
    p.quantity = s1.nextInt(); 


// else 
    p.name = s1.next(); // to get strings 

    // else if(s1.hasNextFloat()) 
    p.price = s1.nextFloat(); 

// now add the line to the product arraylist 
foo.add(p); 

} 

回答

2

你想采取通过行的文件数据线为String(你喜欢的任何集合类型),然后拆分它,无论你发现的空白,并相应地存储数据。采取整行的,你会使用:

nextLine(); 

这样,你会得到一个String说"1 lunch box 3.99"。然后,您将在任何发现空白处分割此空间,并将1作为整数,将lunchbox作为字符串存储,并将3.99作为双精度来存储(不推荐使用双精度数字)。

您可以在这里搜索有用的方法:http://docs.oracle.com/javase/6/docs/api/java/lang/String.html例如,split()方法。

下面是关于如何使用分裂()的例子:

比方说,你输入行1 lunch box 3.99。你已经读入一个字符串,如下所示:

String example = "1 lunch box 3.99" 

要使用split()方法在白色空间拆分此字符串,你会做到以下几点:

String[] splitString = example.split(" "); 

这会给你字符串的阵列具有以下值:

{"1", "lunch", "box", "3.99"}; 

然后,可以使用像Integer.parseInt这些值解析成其适当的类型,Double.parseDouble

+0

尼克是正确的,但是,我真的会推荐使用双倍的钱。浮动不如双倍精确,最终可能导致平衡问题。 – 2013-05-08 01:12:19

+0

谢谢你@nickecarlo。是的,这可能工作。我没有想过这个。 '饭盒'之间有空间的事实呢?这不会使解析带有多个单词的产品更加困难吗? – 2013-05-08 01:12:47

+0

@ user2085446它会的。如果你担心这个问题,然后在逗号分割,你可以将文件改为CSV。这是一个非常简单的方式让你走,但我相信有办法让它工作。我可以从头脑中想出一些粗糙的方法(例如将字符串与中间的空格连接起来),但这会使所有这些都变得混乱。 – 2013-05-08 01:15:27