以下代码旨在循环遍历 txt 文件并创建一个食谱列表,每个食谱都有名称、烹饪时间和成分,这些食谱本身都放在列表中
try (Scanner scanner = new Scanner(Paths.get("recipes.txt"))) {
while (scanner.hasNextLine()) {
name = scanner.nextLine();
cookingTime = Integer.valueOf(scanner.nextLine());
while (!(scanner.nextLine().isEmpty())) {
ingredient = scanner.nextLine();
ingredients.add(ingredient);
}
recipes.add(new Recipe(name, cookingTime, ingredients));
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
这应该适用于任何这种格式的 txt 文件,但特别是这是示例文件
Pancake dough
60
milk
egg
flour
sugar
salt
butter
Meatballs
20
ground meat
egg
breadcrumbs
Tofu rolls
30
tofu
rice
water
carrot
cucumber
avocado
wasabi
我遇到的问题具体与成分列表有关,我强烈怀疑内部 while 循环的条件是造成该问题的原因。
因此,该列表仅包含第一个食谱的所有其他成分。例子中是鸡蛋、糖、黄油。一旦循环到达第二个菜谱,我的总体循环就会被中断,并且我的捕获通知我一个错误:没有找到行。
我的问题基本上可以归结为:
** 为了让我的程序按预期工作,内部 while 循环的条件必须是什么? **
我已经尝试了几件事,但结果本质上是,一旦下一行为空,建议循环停止总是会产生我描述的错误输出,除此之外,我根本不知道如何控制循环在下一行为空时停止添加最后一种成分,必须创建新配方。
作为一个快速的公益广告:我几周前才开始编程,这实际上是赫尔辛基 Java Moocfi 的最终编码练习之一,它教会了我迄今为止所知道的有关编码的知识。因此,请善意地考虑我的专业知识水平非常低,我想我的问题的答案可能非常明显和简单,但不幸的是我无法自己弄清楚如何做到这一点,所以我将不胜感激任何和所有帮助。预先感谢!
正如评论中已经提到的,通过使用
while (!(scanner.nextLine().isEmpty()))
,您将消耗下一行而不将其存储在任何地方,因此没有机会再次访问它。还建议在循环中声明局部变量。尝试这样的事情:
public static void main(String[] args) {
List<Recipe> recipes = new ArrayList<>();
try (Scanner scanner = new Scanner(Paths.get("recipes.txt"))) {
while (scanner.hasNextLine()) {
String name = scanner.nextLine();
int cookingTime = Integer.parseInt(scanner.nextLine());
List<String> ingredients = new ArrayList<>();
String ingredient = scanner.nextLine();
while (!ingredient.isEmpty() && scanner.hasNextLine()) {
ingredients.add(ingredient);
ingredient = scanner.nextLine();
}
recipes.add(new Recipe(name, cookingTime, ingredients));
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
recipes.forEach(System.out::println);
}