【问题标题】:Java While Loop for ArrayList Won't TerminateArrayList 的 Java While 循环不会终止
【发布时间】:2017-12-02 04:32:31
【问题描述】:

我正在尝试设计一个购物车,它可以读取美元金额,然后将这些值打印回来。但是,我的 while 循环不会终止,并且我的数组列表存储了错误的值。

 /**
 * This method is the shopping cart
 */
public static void shoppingCart()
{
    // create scanner objects
    Scanner textReader = new Scanner(System.in);
    Scanner numberReader = new Scanner(System.in);
    // declare variables
    int counter = 0;
    // create arraylist object
    ArrayList<Double> cartItems = new ArrayList<Double>();
    // create decimal format object
    DecimalFormat dollarformatter = new DecimalFormat("$#0.00");
    // print out the first prompt
    System.out.print("Would you like to input item/s - y/n: ");
    String response = textReader.nextLine();
    System.out.println();
    // create while loop to restrict responses to single characters
    while ((!response.equalsIgnoreCase("y")) && (!response.equalsIgnoreCase("n")))
    {
        System.out.print("Sorry - we need a y/n: ");
        response = textReader.nextLine();
        System.out.println();
    }
    // create while loop for positive response
    while ((response.equalsIgnoreCase("y")))
    {
        System.out.print("Please enter an item price, or -1 to exit: $");
        double values = numberReader.nextDouble();
        cartItems.add(values);
        if ((values > (-1)))
        {
            System.out.print("Please enter another item price, or -1 to exit: $");
            values = numberReader.nextDouble();
            cartItems.add(values);
        }
        else if ((values <= (-1)))
        {
            System.out.println();
            System.out.println("********** Here are your items **********");
            System.out.println();
            for (counter = 0; counter < cartItems.size(); counter++)
            {
                System.out.println("Item #" + (counter + 1) + ": " + cartItems.get(counter));
            }
        }
    }
    System.out.println();
    System.out.println("********** Thank you for using the shopping cart **********");
}

结果应如下所示:

但这是我的输出:

  • while 循环不会终止并返回第一个提示:“请输入商品价格,或 -1 退出:”
  • 程序不断将“-1”计数为数组列表的一部分。 “-1”值应该充当“否”并终止向 arrayList 添加更多元素,但在我的代码中,它被吸收到 arrayList 中。我尝试将“-1”转换为字符串以让程序“忽略”它,但它不起作用。
  • 程序列出最后一项后(在我的输出中是#3),它应该询问用户是否要删除一项。我还没有做到这一点,因为我对为什么我的 while 循环拒绝终止以及为什么“-1”一直被包含在我的数组列表中感到很困惑。非常感谢您对此提供的任何帮助,因为我已经考虑了一天,但没有运气。

更新代码;循环终止问题似乎已解决,但“-1”并未触发退出,它仍被添加到 arrayList。

while ((response.equalsIgnoreCase("y"))) {
    System.out.print("Please enter an item price, or -1 to exit: $");
    double values = numberReader.nextDouble();
    cartItems.add(values);
    while ((values != (-1))) {
    System.out.print("Please enter another item price, or -1 to exit: $");
    values = numberReader.nextDouble();
    cartItems.add(values);
    }
    System.out.println();
    System.out.println("********** Here are your items **********");
    System.out.println();
    for (counter = 0; counter < cartItems.size(); counter++) {
    System.out.println("Item #" + (counter + 1) + ": " + cartItems.get(counter));
    }
    break;
}

【问题讨论】:

  • 您的 else if 语句仍在 while 循环内,因此将再次打印提示。也许你应该考虑加入一个 break 语句?此外,您在 if 和 else 语句之前将值添加到购物车,因此它仍会添加 -1。
  • 您能解释一下为什么它不会将“-1”读作“退出”吗?即使我输入“-1”,代码也会继续运行。
  • 当条件为真时,while 循环会不断重复。 if else 语句被输入,但它回到了 while 循环的顶部。

标签: java if-statement arraylist while-loop


【解决方案1】:

问题 1:cartItems.add(values) 发生在 if 语句之前,这意味着 -1 仍会添加到购物车中。换句话说,在您测试它是否低于零之前,您正在向购物车添加值。

问题 2:你的 else if 执行了,但是由于它在一个 while 循环中并且你的响应没有改变,它再次提示用户,因为 while 循环条件仍然是 true。我建议在 else if 语句的末尾放置一个 break 语句。但是我的代码不需要这样做。

我会这样做:

if((response.equalsIgnoreCase("y")))
{
    System.out.print("Please enter an item price, or -1 to exit: $");
    double values = numberReader.nextDouble();
    while ((values > (-1)))
    {
        cartItems.add(values);
        System.out.print("Please enter another item price, or -1 to exit: $");
        values = numberReader.nextDouble(); 
    }
 }
 System.out.println();
 System.out.println("********** Here are your items **********");
 System.out.println();
 for (counter = 0; counter < cartItems.size(); counter++){
      System.out.println("Item #" + (counter + 1) + ": " + cartItems.get(counter));
 }
 System.out.println();
 System.out.println("********** Thank you for using the shopping cart **********");

基本上,我所做的就是意识到,您所需要的只是一种具有 while 循环的方法,这样您就不必像在之前的代码中那样在知道它低于 0 之前过早地将其添加到购物车中。我建议调查栅栏柱问题。栅栏柱的形式为 |-|-|等等。所以栅栏柱是你的提示,电线正在添加值。因此,我的方式更好,因为我切换了顺序。就这么简单。

【讨论】:

  • 我想我修复了循环终止问题,但仍在添加 -1。
  • 您是否将 cartItems.add(values) 放在 if 语句中,并从 if 语句之前将其删除?
  • 我实际上完全删除了 if/else 语句。相反,我使用了一个 while 语句。我在上面的原始帖子中更新了代码。你会建议我使用 if/else 语句吗?我想也许一个 while 声明可能会澄清一些事情。
  • 我认为早期的代码很好。您仍然有两次 add(values) 。删除旧代码中 if 语句之前的那个。在您的新代码中为嵌套的 while 循环删除它。
  • 是的,没问题,我很高兴它有帮助。可能你们的课还没学,我几乎每周都会遇到栅栏柱的问题。赞成票表示赞赏:)
【解决方案2】:

请记住,您的 for 循环包含在多个不同的条件中。它会一直运行,直到 while 循环完成。

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 2016-01-15
    • 2015-04-21
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    相关资源
    最近更新 更多