0

次のようなデータファイルを読み込もうとしています:

N 1000.0 ニューヨーク              
R 2000.0 CA 0.09            
R 500.0 GA 0.07           
N 2000.0 WY             
○ 3000.0 日本 0.11 20.0            
N 555.50 CA            
O 3300.0 エクアドル 0.03 30.0          
R 600.0 NC 0.06

それを使用してarrayListを埋めます

私のプログラムは、抽象クラスとそれを実装するための 3 つのクラスで構成されています。

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.

動作しないスイッチ状態でコードを更新しました。ケース 1、2、3 の代わりに N、O、R を使用する必要がありますか、それとも各タイプの注文をどのように参照すればよいですか? また、「タイプの不一致」エラーが発生していますが、修正できません。

4

1 に答える 1

1

ArrayList と read orders メソッドを正しく初期化していません。このコードは正しくありません。メソッドは の後に終了し、;何もせず、残りは無効です。

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

あなたがする必要があるのはreadOrder、次のようなメソッドを作成することです。ファイルを読み取る方法については、この投稿を参照してください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
}

次に、メインメソッドで

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してキャストする必要がある場合があります。ただし、基本クラスでメソッドを宣言し、サブクラスでのみオーバーライドする場合、これを回避できます。リストから読み取ると、最初にサブクラスでメソッドが検索され、見つからない場合は次に検索されます基本クラスにある場合、基本クラスにない場合は明らかにエラーが発生します。これは、抽象基本クラスを持つことが便利であり、これを避けることができることを意味します

Order ord = orders.get(anIndex)

if(ord instanceof NonProfitOrder)
    ((NonProfitOrder)ord).aNonprofitOrderSpecificMethod()
else if (ord instanceof RegularOrder())
    ((RegularOrder)ord).aRegularOrderSpecificMethod();
//.....
于 2013-09-12T01:57:39.213 に答える