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

開始文字は、さまざまな種類の注文です。注文の種類ごとに異なるパラメーターがあります。テキスト ファイルから次のような形式で注文を読み取るメソッドが必要です: Type Price Location [TaxRate] [Tariff]. 私の混乱のポイントは、データをタイプごとに配列にソートする方法です。

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

0

配列リストをタイプ別にソートするためのベスト プラクティスは次のとおりです。

まだ実装されていない場合は、フィールドがあり、アクセサー メソッドがあると仮定して、次を返すようにOrder実装Comparableしてオーバーライドします。compareTo(Order o)String typegetType()

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

Arrays.sort(orders)次に、ファイルをスキャンしたら、単に呼び出します。

またはを使用しComparatorます。

そうは言っても、コード内で最も間違っているもののいくつかの短いリストを次に示します。

Order(1) あなたが質問した主なクラスであるクラスのソースを投稿していません。より具体的な答えを出すのが難しくなります。

(2)readOrders()投稿した関数は不完全であるか、または (不足している中括弧をいくつか追加してforループを閉じても) 8 つの null 参照を含むリストを返します。オブジェクトをインスタンス化する必要がありOrderます。

Order[](3)でリストを使用する代わりに配列を使用するのはなぜArrayList.add()ですか?

(4) がファイルのロードに失敗すると、ブロックの後の最初の行でScannera がスローされます。NullPointerExceptioncatch

(5) キャッチによって配列が終了したかどうかを確認するArrayIndexOutOfBoundsException()ことは、さまざまな理由から悪い習慣です。あなたが私を信じていない場合は、Googleで検索してください。

Order.printOrder(String)(6) が定義されていないため、コンパイル エラーが発生します。それを定義するか、さらに良いことにオーバーライドします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 に答える
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 に答える