簡體   English   中英

如何通過Java中的類型將文本文件中的信息排序為數組?

[英]How to sort info from a text file into an array by type in java?

我正在嘗試編寫一種將讀取如下所示文本文件的方法:

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] [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)

好。 這是一個編譯錯誤。 Order類不包含您正在調用的方法。 例如

    printOrder("Long")

檢查類Order。 在這里你沒有提供

如前所述,您遇到了編譯錯誤。 您的Order類需要具有printOrder(String)方法。

您還應該檢查您的readOrders方法。 它似乎總是返回空的Orders,因為您使用以下命令創建了order數組

Order[] order = new Order[8];

但是,切勿分配以下內容:

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

捕獲塊似乎也錯了

} catch (ArrayIndexOutOfBoundsException e) {

您需要關閉它!

按類型對數組列表進行排序的最佳實踐是:

如果還沒有,請令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無法加載文件時,它將在catch塊之后的第一行引發NullPointerException

(5)由於多種原因,通過捕獲ArrayIndexOutOfBoundsException()來檢查數組是否已結束是不好的做法。 如果您不相信我,請使用Google。

(6)因為Order.printOrder(String)所以出現編譯錯誤。 定義它,或者更好地重寫Order.toString()

考慮重寫代碼以解決這些問題。 可能還有更多,這些只是乍一看而已。

我想出了我想要的答案。 這里是:

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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM