該方法回傳一個“成分”物件,該物件是從配方 txt 檔案中的給定行構造的。注意:anInvalidIngredientException類似于. 這不是由給定配方檔案中的任何行引發的。IngredientInputMismatchException
public static Ingredient parseString(String line)
throws InvalidIngredientException {
double quantity = 1;
String measurement = "";
String[] parts = line.split(";");
if (parts.length == 1) {
throw new InvalidIngredientException(EXP_MSG);
}
if (!parts[0].trim().isEmpty()
&& !(Double.parseDouble(parts[0]) == 1)) {
quantity = Double.parseDouble(parts[0].trim());
}
if (!parts[1].trim().isEmpty()) {
measurement = parts[1].trim();
}
return new Ingredient(quantity, measurement, parts[2].trim());
}
配方檔案如下所示:
Cranberry Oatmeal Chews
8; tablespoon; butter
2; tablespoon; oil
1; cup; light brown sugar
1; ; zest of one orange
6; tablespoon; sour cream
2; teaspoon; vanilla
1.5; cup; flour
.5; teaspoon; baking soda
1; teaspoon; cinammon
.5; teaspoon; salt
2; cup; oats
1.5; cup; dried cranberries
.5; cup; walnuts
該方法有效,但我覺得它可以使用更少的代碼。
uj5u.com熱心網友回復:
您正在嘗試做的事情稱為“將 CSV 行系結到物件”。決議 CSV 的庫有很多,大多數成熟的庫也提供系結功能。還有一些基于注釋的代碼生成框架,如 Lombok 或 Jackson,它們使 Java 更接近于 Scala 等方便的語言,通過使您免于手動撰寫非常冗長的 getter/setter(可能對構建程序有一點復雜性) .
一旦你使用正確的搜索詞,你會發現很多例子。一個做我上面描述的就是這個,下面是一個根據你的命名調整的版本。它正在使用杰克遜。
帶有杰克遜注釋的物件定義:
@JsonPropertyOrder({"quantity", "measure", "ingredient"})
public class Ingredient {
public double quantity;
public String measure;
public int ingredient;
}
Jackson CsvMapper的呼叫代碼:
List<Ingredient> result = new CsvMapper()
.readerWithTypedSchemaFor(Ingredient.class)
.readValues(csvFile)
.readAll();
uj5u.com熱心網友回復:
你可以做一些小事來讓你的代碼看起來更好,并稍微提高性能。
- 將行拆分為“\s;\s”時更改正則運算式。這樣可以避免 trim() 多次呼叫
- 使用
else if...else語法。這將使您的代碼不僅更短,而且更易于閱讀。
uj5u.com熱心網友回復:
我不習慣 Java,所以這段代碼可能會有一些小錯誤。如果您看到一個,請隨時編輯。
從 C# 的角度來看,我將進行以下更改:
- 將
.trim()呼叫轉移到一個地方。parts在這里,我只是在通過創建Stream使用of()然后呼叫map(假設 Java 8 或更高版本)將輸入行拆分為之后執行此操作。 quantity洗掉為和實體化默認值的行measurement。因為我們不用修剪,所以可以使用三元運算子在同一行宣告和實體化變數。- 不要檢查是否
parts[1]為空。由于is 是后備值,因此is 也""無關緊要。這也意味著您不需要中間變數。parts[1]""measurement
public static Ingredient parseString(String line)
throws InvalidIngredientException {
String[] parts = Stream.of(line.split(";")).map(p => p.trim()).toArray();
if (parts.length == 1) {
throw new InvalidIngredientException(EXP_MSG);
}
double quantity = parts[0].isEmpty() ? 1 : Double.parseDouble(parts[0]);
return new Ingredient(quantity, parts[1], parts[2]);
}
除了InvalidIngredientExceptionifparts.length == 0或 ifparts[0]無法決議為Double. 我不確定在宣告你的方法可以拋出哪些例外時你應該有多嚴格,但這里有一個版本應該捕獲任何例外并只回傳InvalidIngredientException你宣告的例外。
public static Ingredient parseString(String line)
throws InvalidIngredientException {
try {
String[] parts = Stream.of(line.split(";")).map(p => p.trim()).toArray();
double quantity = parts[0].isEmpty() ? 1 : Double.parseDouble(parts[0]);
return new Ingredient(quantity, parts[1], parts[2]);
}
catch (Exception e) {
throw new InvalidIngredientException(EXP_MSG);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/466541.html
