Java StringTokenizer不同的数据类型

时间:2016-10-26 21:13:19

标签: java

我最近在大学里接受过小班考试,我需要帮助。

我有一个名为“Products”的对象,它接受(String,double,int)作为参数。

我创建了一个ArrayList

ArrayList<Product> products = new ArrayList<>();

我要做的是使用StringTokenizer来读取这种格式和 将它存储到单个对象中,然后我想打印出对象内容。

PR0001 7.99 10
PR0002 29.99 0
PR0003 5.99 25
PR0004 99.99 50
PR0005 17.99 15
PR0006 15.99 0
PR0007 19.99 35
PR0008 39.99 40
PR0009 2.99 0
PR0010 3.99 5

我的主要方法是:

package objects;
import java.util.ArrayList;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.StringTokenizer;
public class main_object_class
{
    public static void main(String[] args)
    {
        ArrayList<Product> products = new ArrayList<>();
        String fileName = "products.txt";

        try
        {
        Scanner file = new Scanner(new File(fileName));
        while(file.hasNextLine())
        {
            StringTokenizer strToken = new StringTokenizer(file.next(), " ");
            while(strToken.hasMoreTokens())
            {
                String pCode = strToken.nextToken();
                System.out.println("pCode Works");
                double pPrice = Double.parseDouble(strToken.nextToken());
                System.out.println("pPrice Works");
                int pQuantity = Integer.parseInt(strToken.nextToken());
                System.out.println("pQuantity Works");
                products.add(new Product(pCode,pPrice,pQuantity));
                System.out.println("Storing Works");
            }
        }

        for(int i=0;i<products.size();i++)
        {
            System.out.println(products);
        }

        }catch(FileNotFoundException e)
        {
            e.printStackTrace();
        }
    }
}

我的产品方法:

package objects;
public class Product
{
    private String pCode = "";
    private double pPrice = 0;
    private int pQuantity = 0;

    public Product(String c, double p, int q)
    {
        pCode = c;
        pPrice = p;
        pQuantity = q;
    }

    public void setCode(String c)
    {
        pCode = c;
    }

    public String getCode()
    {
        return pCode;
    }

    public void setPrice(double p)
    {
        pPrice = p;
    }

    public double getPrice()
    {
        return pPrice;
    }

    public void setQuantity(int q)
    {
        pQuantity = q;
    }

    public int getQuantity()
    {
        return pQuantity;
    }

    @Override
    public String toString()
    {
        return "Code : " + getCode() + "\tPrice : $" + getPrice() + "\tQuantity : " + getQuantity();
    }


}

我的错误:

run:
pCode Works
Exception in thread "main" java.util.NoSuchElementException
    at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
    at objects.main_object_class.main(main_object_class.java:24)
C:\Users\Alex\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)

我真的要感谢所有的投入。我已经尝试了所有解决方案,但它们都有效。然而,我将选择@Jerin Joseph解决方案!

2 个答案:

答案 0 :(得分:1)

  1. 逐行阅读文件,Scanner::nextLine()一次为您提供一行。

    StringTokenizer strToken = new StringTokenizer(file.nextLine(), " ");

  2. 删除while(strToken.hasMoreTokens()),您需要针对您解析的每个令牌进行检查。

  3. 将其更改为,

    String pCode = "";
    double pPrice = 0;
    int pQuantity = 0;
    
    if(strToken.hasMoreTokens()){
        pCode = strToken.nextToken();
        System.out.println("pCode Works");
    }
    if(strToken.hasMoreTokens()){
        pPrice = Double.parseDouble(strToken.nextToken());
        System.out.println("pPrice Works");
    }
    if(strToken.hasMoreTokens()){
        pQuantity = Integer.parseInt(strToken.nextToken());
        System.out.println("pQuantity Works");
    }
    products.add(new Product(pCode,pPrice,pQuantity));
    System.out.println("Storing Works");
    

答案 1 :(得分:0)

你的问题是你检查是否有剩余的标记,而不是调用“nextToken()”3次。除非您专门检查,否则无法保证将有3个令牌。像这样:

 if(strToken.countTokens() >= 3)
 {
     \\ here you can call strToken.nextToken() safly for 3 times.
 }

您当前的approuch是基本ittration的经典approuch。 E.g。

 while(strToken.hasMoreElements())
  {
      String next = strToken.nextToken();
  }

但它只允许在支架之间安全调用“nextToken()”。

我希望这有帮助