【问题标题】:readOrders and fill ArrayList读取订单并填充 ArrayList
【发布时间】:2013-09-12 01:34:07
【问题描述】:

我正在尝试读取这样的数据文件:

N 1000.0 纽约
R 2000.0 CA 0.09
R 500.0 GA 0.07
N 2000.0 怀俄明
O 3000.0 日本 0.11 20.0
N 555.50 加利福尼亚州
O 3300.0 厄瓜多尔 0.03 30.0
R 600.0 NC 0.06 

并用它来填充一个arrayList

我的程序由一个抽象类和三个实现它的类组成:

1。非营利组织

public class NonProfitOrder extends Order {

public NonProfitOrder(double price, String location) {
    super(price, location);
}
public double calculateBill() {
    return getPrice();
}
public String printOrder(String format){
    String Long = "Non-Profit Order" + "\nLocation: " + getLocation() +  "\nTotal Price: " + getPrice();
    String Short = "Non-Profit Order-Location: " + getLocation() + ", " + "Total Price: " + getPrice();
    if (format.equals("Long")){
        return Long;
    }
    else{
        return Short;
    }
}
}

2。常规顺序

public class RegularOrder extends Order {
double taxRate;

public RegularOrder(double price, String location, double taxRate) {
    super(price, location);
    this.taxRate = taxRate;
}
private double calcTax() {
    double tax;
    tax = getPrice() * taxRate;
    return tax;
}
public double calculateBill() {
    double bill;
    bill = price + calcTax();
    return bill;
}
public String printOrder(String format){
    String Long = "Regular Order" + "\nLocation: " + getLocation() +  "\nPrice: " + getPrice() + 
            "\nTax: " + calcTax() + "\nTotal Price: " + calculateBill();
    String Short = "Regular Order-Location: " + getLocation() + ", " + "Total Price: " + calculateBill();
    if (format.equals("Long")){
        return Long;
    }
    else{
        return Short;
    }
}
}

和另一个非常相似的RegularOrder

我的问题出在我的主要问题上。我必须使用方法readOrders(fileName:string):ArrayList<Order>

public static ArrayList<Order> readOrders (String fileName) throws FileNotFoundException{
    String type;
    Scanner s = new Scanner(new File("orders.txt"));
    ArrayList<Order> orders = new ArrayList<Order>();
    while (s.hasNext()){
        type = s.nextLine();
    }
    switch(type) {
        case 1: type = NonProfitOrder();
            break;
        case 2: type = RegularOrder();
            break;
        case 3: type = OverseasOrder();
    return orders;
}

}

我无法弄清楚如何正确执行此操作,因为它仍然说

readOrders 无法解析为类型。

以及第一个readOrders的其他问题。

我用某种开关状态更新了我的代码,但它不起作用。我应该使用 N、O、R 而不是案例 1、2、3,或者我将如何引用每种类型的订单?我也遇到了“类型不匹配”错误,但我无法修复它。

【问题讨论】:

  • ArrayList&lt;Order&gt; orders2 = new readOrders("orders.txt");这句话没有意义..我同意你的编译器
  • 你只需要跳过new吗?如果您的函数返回数组列表,那将起作用
  • readOrders 方法在哪里??
  • 我删除了我错误地放在那里的“新”。 readOrders 方法是我的问题,我不知道怎么写。我的 UML 有它作为 readOrders(fileName:string):ArrayList。但是,当我编写诸如“public ArrayList readOrders(String fileName)”之类的内容时,我得到'Illegal modifier for parameter readOrders;只有 final 是允许的'并且似乎无法修复它
  • Reading from data file to fill ArrayList 的可能重复项与您之前的问题类似。

标签: java arraylist readfile


【解决方案1】:

您没有正确初始化 ArrayList 和读取订单方法。这里的代码不正确,方法在;之后结束,什么都不做,其余的无效

ArrayList<Order> readOrders (String fileName); {
    ArrayList<Order> orders2 = new readOrders("orders.txt");
}

您需要做的是创建一个方法readOrder,如下面的See this post on how to read in the file。除了你的情况,你需要在循环中做更多的工作来创建 Order 对象

public static ArrayList<Order> readOrders (String fileName){
     ArrayList<Order> orders = new ArrayList<Order>();
     //Read in lines from your file
     //Decide which type of order it is and create it
     //Add it to the list
     //Repeat until end of file
     return orders
}

然后在你的 main 方法中

public static void main(String[] args) {
     ArrayList<Order> loadedOrders = readOrders("orders.txt");
     //... rest of your code
}

附加编辑

要将它们插入到列表中,请执行以下操作

char firstChar =  //Read in the first character of the line from the file
Order anOrder;
switch(firstChar)
{
    case 'N':
       anOrder = new NonProfitOrder();  //adding arguments to construtor as needed
       break;
    case 'R':
       anOrder = new RegularOrder();
       break;
    default:
       anOrder = new Order();
       break;
 }
 loadedOrders.add(anOrder);

然后在阅读时,根据您需要对订单执行的操作,您可能需要使用instanceof 并进行转换。但是,如果在基类中声明了方法并且仅在子类中覆盖它们,则可以避免这种情况,然后当您从 List 中读取时,首先在子类中查找该方法,如果未找到则查找该方法在基类中,那么如果它不在基类中,显然你会得到一个错误。这其中有一个抽象基类很有用,意味着你可以避免这样做

Order ord = orders.get(anIndex)

if(ord instanceof NonProfitOrder)
    ((NonProfitOrder)ord).aNonprofitOrderSpecificMethod()
else if (ord instanceof RegularOrder())
    ((RegularOrder)ord).aRegularOrderSpecificMethod();
//.....

【讨论】:

  • 好吧,这是有道理的,除了一个问题,我将如何区分不同的类型?
  • 猜测一下:数据文件中的第一个字母似乎与它的订单类型有关
  • 是的,所以我需要对所有三种类型的 if 语句?
  • 是的,或者因为它是单个字符,您可以使用switch
  • 好的,我每次都无法使用开关来引用。我需要一个变量来引用每种类型或实例吗?
猜你喜欢
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多