1

我正在尝试从由单个项目和回车之间的空格分隔的文件中读取值。

所以文本文件类似于

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);

}
4

1 回答 1

2

您希望将文件数据逐行转换为字符串(您喜欢的任何 Collection 类型),然后将其拆分到找到空白的任何位置并相应地存储数据。要了解您将使用的整条线:

nextLine();

这样你就会得到一个 String say "1 lunch box 3.99"。然后,您可以在找到空白的任何地方将其拆分,并将其存储1为 int、String 和lunchdouble (不建议使用 doubles 作为货币)。box3.99

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

下面是一个关于如何使用 split() 的示例:

假设您的输入行是1 lunch box 3.99. 您已经将其读入字符串,如下所示:

String example = "1 lunch box 3.99"

要使用 split() 方法在空白处拆分此字符串,您需要执行以下操作:

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

这将为您提供具有以下值的 String 数组:

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

Integer.parseInt然后,您可以使用,Double.parseDouble等将这些值解析为正确的类型。

于 2013-05-08T01:08:48.623 回答