[英]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.