【问题标题】:ArrayList will not allow scanner inputArrayList 不允许扫描仪输入
【发布时间】:2014-07-31 11:07:54
【问题描述】:

我再次对代码中的某些内容感到困惑。我是初学者,但我仍然熟悉 Scanner 类。但是,对于通用数组,它会绕过用户输入的字符串。我想了解为什么 ArrayList 没有“收集”它:

public static void addingIngredients(){
    ArrayList<String> Ingredients = new ArrayList<String>();
    String addedIngredient = input.nextLine();
    Ingredients.add(addedIngredient);
    System.out.println(Ingredients +": Continue?" );
    System.out.println("1 (Yes) / 2 (No)");
    int choice = input.nextInt();
    switch (choice){
    case 1:
        addingIngredients();
    case 2:
        System.out.println("Test");
    }
}

正在跳过字符串“ addedIngredient”;这是我通过控制台收到的:

 Now Loading...
 What Ingredients are in this protein powder? 
 Begin Add?
 1 (Yes) / 2 (No)
 1
 []: Continue?
 1 (Yes) / 2 (No)
 1
[]: Continue?
1 (Yes) / 2 (No)
2
Test

提前谢谢你。 P.S:有没有更方便的方法来编写一个循环来从用户那里收集数据?

【问题讨论】:

  • 请学会尊重 Java 命名约定。变量以小写字母开头。此外,您应该在每个案例中都休息一下,否则即使用户输入了 1,也会执行 case2。
  • 对这种特定类型的用户输入使用递归并不是一个好主意。递归往往会为每个内部调用分配堆栈空间,一旦超过 JVM 的专用堆栈空间,就会收到堆栈溢出异常。在您的情况下,这几乎不会发生,因为您需要输入无数种成分。不过,这是一种不好的做法。
  • 这我知道,我只是不关心“次要”细节......直到我在这里发布!哈哈!我道歉...
  • 会记住的,Ivaylo。

标签: java


【解决方案1】:

您正在为每次调用创建一个新的 ArrayList。您需要使用相同的方法来收集每个递归调用的结果。

这里有一个更简单的版本,您可以从这里开始:

ArrayList<> ingredients = ...
while (true) {
  //primpt for ingrediant, add to list
  if (endOfInput()) { //this is where you prompt for 1/2
     break;
  }
}

【讨论】:

  • +1。另一个问题是 nextInt() 不消耗行尾。所以下一次调用 nextLine() 返回一个空字符串。
  • 哇,这是一个很好的观点。那么我应该只创建一个返回数组吗?
  • @user130110 - 我在我的答案中加入了一些框架代码。只需填写缺少的部分
  • 我已经创建了一个收集输入的测试方法,但是那个时候我根本想不出一个循环。现在我知道要多考虑一下循环本身了,谢谢你们!
  • 我没有注意到你给我的代码,谢谢你,radai。
猜你喜欢
  • 1970-01-01
  • 2016-12-21
  • 2021-11-11
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 2021-03-15
  • 2012-09-13
  • 2016-06-12
相关资源
最近更新 更多