[英]Read data from a text file and create an object
我需要一些幫助:我正在用 Java 進行超市模擬,但我遇到了一個問題,我有一個文本文件 (Stock.txt),其中包含所有超市庫存,例如:
其中第一個數字是產品的“id”,其次是產品所屬的部門,第三個是產品名稱,接下來是價格,最后一個數字是該產品的庫存數量. 我有這門課:
public class Product {
protected String name;
protected double price;
protected String department;
protected int id;
protected int stock;
}
所以,基本上我需要做的是從文本文件中讀取每一行並創建產品,即對於第一行,做這樣的事情:
Product product1 = new Product(0,"Bakery","Chocolate Cake", 12.5, 250);
然后將其添加到數組中
Product[0] = product1;
對於文本文件中的所有內容,當運行模擬時,每個客戶將購買隨機數量的庫存隨機產品,因此庫存數量將減少。 最后,當模擬結束時,程序必須在同一個文本文件中寫入每個產品的修改數量。
問題是這可能太容易了,但我不知道如何做到這一點,因為自從我開始用 Java 編程(我是初學者)以來,用 Java 讀取和寫入文件對我來說一直是一個真正的問題。 我有一些使用 BufferedReader 和 StringTokenizer 類來讀取和創建對象問題的想法,但我不知道如何去做,我也不知道我必須如何做覆蓋問題。 我真的很感激你的幫助!
哦! 順便說一句,我真的只需要使用數組,所以使用 ArrayList 或任何其他結構甚至都不是一個選擇:(
這是一個很好的Scanner
讀取數據的工作。 至於不能使用像ArrayList
這樣的集合,你必須自己動態地重新分配一個數組。
請嘗試以下操作:
public static void main(String[] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("Stock.txt"));
input.useDelimiter("-|\n");
Product[] products = new Product[0];
while(input.hasNext()) {
int id = input.nextInt();
String department = input.next();
String name = input.next();
double price = Double.valueOf(input.next().substring(1));
int stock = input.nextInt();
Product newProduct = new Product(name, price, department, id, stock);
products = addProduct(products, newProduct);
}
for (Product product : products) {
System.out.println(product);
}
}
private static Product[] addProduct(Product[] products, Product productToAdd) {
Product[] newProducts = new Product[products.length + 1];
System.arraycopy(products, 0, newProducts, 0, products.length);
newProducts[newProducts.length - 1] = productToAdd;
return newProducts;
}
public static class Product {
protected String name;
protected double price;
protected String department;
protected int id;
protected int stock;
private static NumberFormat formatter = new DecimalFormat("#0.00");
public Product(String n, double p, String d, int i, int s) {
name = n;
price = p;
department = d;
id = i;
stock = s;
}
@Override
public String toString() {
return String.format("ID: %d\r\nDepartment: %s\r\nName: %s\r\nPrice: %s\r\nStock: %d\r\n",
id, department, name, formatter.format(price), stock);
}
}
結果:
ID: 0
Department: Bakery
Name: Chocolate Cake
Price: 12.50
Stock: 250
ID: 1
Department: Meat
Name: Premium Steak
Price: 2.60
Stock: 120
ID: 2
Department: Seafood
Name: Tuna
Price: 1.20
Stock: 14
為簡單起見,我將所有項目定義為字符串。
產品DAO:
public class Product {
private String name;
private String price;
private String department;
private String id;
private String stock;
//generate `enter code here`
//getters & setters
//toString
將您的產品列表放在“testData/product.txt”中。 這是假設您的產品列表采用相同格式,即 id-department-name-price-stock \\n。
使用下面的 jUnit 測試來測試您的代碼。 您當然可以修改閱讀 product.txt 文件的方式(可能是其他強大的字符串閱讀器)。
@Test
public void test() {
try {
List<String> productLines = Files.readAllLines(java.nio.file.Paths.get("./testData/product.txt"), StandardCharsets.UTF_8);
for (String line: productLines)
Product product = new Product();
String[] tokens = line.split("-");
product.setId(tokens[0]);
product.setDepartment(tokens[1]);
product.setName(tokens[2]);
product.setPrice(tokens[3]);
product.setStock(tokens[4]);
System.out.println(product.toString())
}
} catch (IOException e) {
e.printStackTrace();
}
}
對於未來的讀者。
我的 csv(逗號分隔值)文件周圍有雙引號。 並有一些雙打和整數。
我也瘋狂地試圖在 csv 文件中找到一條“壞線”和令人討厭的值......。 因此,我的例外是一個體面的消息。
我的“分隔符”是逗號和回車符。 我處理“在列級別”的雙引號。
這是我想出的。
/* I know, a java example with the imports listed out ! shocking !! */
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
private void loadFromFile() {
Collection<MyCustomObject> items = new ArrayList<MyCustomObject>();
int lineNumber = 0;
String nextValue = "";
try {
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("MyFile.txt").getFile());
Scanner input = new Scanner(file)
.useDelimiter(",|\\R")
.useLocale(Locale.ENGLISH);
;
/* skip the header */
input.nextLine();
while (input.hasNext()) {
lineNumber++;
nextValue = input.next().replace("\"", "");
String zipCodeValue =nextValue;
nextValue = input.next().replace("\"", "");
String city = nextValue;
nextValue = input.next().replace("\"", "");
String usaState = nextValue;
nextValue = input.next().replace("\"", "");
double latitude = Double.valueOf(nextValue);
nextValue = input.next().replace("\"", "");
double longitude = Double.valueOf(nextValue);
nextValue = input.next().replace("\"", "");
int population = Integer.valueOf(nextValue);
items.add(new MyCustomObject(zipCodeValue, city, usaState, latitude, longitude, population));
}
} catch (Exception ex) {
throw new RuntimeException(String.format("Line number '%s, nextValue '%s''", lineNumber, nextValue), ex);
}
}
示例文本 (csv) 文件:
"ZIPCODE","CITY","STATE","LATITUDE","LONGITUDE","POPULATION"
"06778","NORTHFIELD","CT",41.707,-73.105,555
"06779","OAKVILLE","CT",41.595,-73.081,777
"06782","PLYMOUTH","CT",41.657,-73.041,888
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.