0

我正在尝试编写一个方法来读取如下所示的文本文件:

N 1000.0 NY 
R 2000.0 CA 0.09 
R 500.0 GA 0.07 
N 2000.0 WY 
O 3000.0 Japan 0.11 20.0 
N 555.50 CA 
O 3300.0 Ecuador 0.03 30.0 
R 600.0 NC 0.06

起始字母是不同类型的订单。每种类型的订单都有不同的参数。我希望该方法以如下格式从文本文件中读取订单:键入价格位置 [TaxRate] [关税]。我的困惑是如何按类型将数据排序到数组中。

public static ArrayList<Order> readOrders (String fileName)
{

    File file = new File (fileName);

    scan = null;
    try {
        scan = new Scanner(file);
    } catch (FileNotFoundException e) {
        System.out.println("Error, file not found: " + file.toString());
        e.printStackTrace();
    }

    Order[] order = new Order[8];

    for (int i = 0; i < order.length; i++) {
    String data = scan.nextLine(); // you need to use nextLine to read a whole line
    String[] val = data.split(" ");
    String type = val[0]; // Since its a String
    double price = Double.parseDouble(val[1]);
    String location = val[2];  // Since its a String
    double taxRate = 0.0; // Default values
    double tariff = 0.0; // Default values
    try { // Incase they are not present - error handling
    taxRate = Double.parseDouble(val[3]);
    tariff = Double.parseDouble(val[4]);
    } catch (ArrayIndexOutOfBoundsException e) {
}
    ArrayList <Order> orders =new ArrayList<Order>(Arrays.asList(order));
    return orders;

我无法让它与我的主要方法一起使用:

public static void main(String[] args) 
{
    ArrayList<Order> orders2 = readOrders("orders.txt"); 

    for( Order o2 : orders2) 
    { 
        System.out.println( o2.printOrder("Long")); 
    } 

    for( Order o2 : orders2) 
    { 
        System.out.println(o2.printOrder("Short")); 
    } 

}

这是我的错误代码:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    The method printOrder(String) is undefined for the type Order
    The method printOrder(String) is undefined for the type Order

    at prob1.OrderTester.main(OrderTester.java:19)
4

4 回答 4

1

好。这是一个编译错误。Order 类不包括您正在调用的方法。例如

    printOrder("Long")

检查班级订单。在这里你没有提供它

于 2013-09-12T16:08:06.643 回答
0

就像已经提到的那样,您遇到了编译错误。您的 Order 类需要有一个 printOrder(String) 方法。

您还应该检查您的 readOrders 方法。它似乎总是返回空订单,因为您创建了订单数组

Order[] order = new Order[8];

但永远不要分配类似的东西:

order[i] = new Order(type, price, location, etc ...);

catch 块似乎也是错误的

} catch (ArrayIndexOutOfBoundsException e) {

你需要关闭它!

于 2013-09-12T17:17:09.423 回答
0

按类型对数组列表进行排序的最佳做法是:

如果还没有,请Order实现Comparable并覆盖compareTo(Order o)以返回以下内容,假设有一个String type字段并且它有一个访问器方法getType()

@Override
public int compareTo(Order o) {
    return type.compareTo(o.getType());
}

然后只需Arrays.sort(orders)在扫描文件后调用。

或使用Comparator.

话虽如此,以下是您的代码中一些最错误的内容简短列表:

(1)您还没有发布Order课程的来源,这是关于您提出的问题的主要课程。很难给出更具体的答案。

(2)readOrders()您发布的函数要么不完整,要么(即使您添加了一对缺少的花括号并关闭for循环)返回一个包含 8 个空引用的列表。您需要实例化Order对象。

(3) 为什么使用数组Order[]而不是只使用列表ArrayList.add()

(4) 任何时候Scanner加载文件失败,都会在块NullPointerException之后的第一行抛出一个。catch

ArrayIndexOutOfBoundsException()(5)出于多种原因,检查您的数组是否已通过捕获结束是不好的做法。不信的话谷歌一下。

(6) 你得到一个编译错误,因为Order.printOrder(String)没有定义。定义它,或者更好地覆盖Order.toString()

考虑重写代码来解决这些问题。可能还有更多,这些只是乍一看跳出来的东西。

于 2013-09-12T17:27:52.550 回答
0

我想出了我正在寻找的答案。这里是:

public static ArrayList<Order> readOrders (String fileName)
    {
        File file = new File (fileName);
        ArrayList<Order> o = new ArrayList<Order>();

        scan = null;
        try {
            scan = new Scanner(file);
        } catch (FileNotFoundException e) {
            System.out.println("Error, file not found: " + file.toString());
            e.printStackTrace();
        }


        while (scan.hasNext())
        {
            String fl = scan.next();

            if (fl.equals("N"))
            {
                NonProfitOrder n = new NonProfitOrder(scan.nextDouble(), scan.next());
                o.add(n);
            }
            else if (fl.equals("R"))
            {
                RegularOrder r = new RegularOrder (scan.nextDouble(), scan.next(), scan.nextDouble());
                o.add(r);
            }
            else
            {
                OverseasOrder oo = new OverseasOrder(scan.nextDouble(), scan.next(), scan.nextDouble(), scan.nextDouble());
                o.add(oo);
            }

        }
        return o;
    }
于 2013-09-19T00:42:37.517 回答