当前位置: 首页 > 知识库问答 >
问题:

数组列表的Java While循环不会终止

东郭承业
2023-03-14

我试图设计一个购物车,读取美元数额,然后打印这些值回来。然而,我的时循环不会终止,我的数组列表存储了错误的值。

 /**
 * 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”并没有触发退出,它仍然被添加到数组列表中。

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;
}

共有2个答案

毋举
2023-03-14

请记住,您的for循环位于多个不同的条件中。它将一直运行,直到循环完成。

欧阳鸿哲
2023-03-14

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

问题2:你的else if执行了,但是因为它在while循环中,你的响应没有改变,它再次提示用户,因为while循环条件仍然为真。我建议在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之前过早地添加到你的购物车中。我建议调查栅栏柱的问题。栅栏柱的形式是|-|-|等。所以栅栏柱是你的提示,电线在加值。因此,我的方法更好,因为我改变了顺序。就这么简单。

 类似资料:
  • 我有一个家庭作业。。。代码如下。。。有几个问题要问。。。提前谢谢。Java初学者。。。如果这看起来很笨拙,请不要笑 有没有办法对我问的每个问题使用我的IF语句,而不必为每个问题更改字符串名称? 有没有办法创建一个方法(?)对于那些如果语句,所以我不必为我问的每一个问题写出来? 如果用户在10秒内没有输入答案,我想有一个定时器提示他们回答,我该怎么做?

  • 我是java的新手,我正在编写这个简短的程序,您可以在其中猜测1到10之间的数字。正确的数字存储为整数。如果您猜测较低的数字,它应该说“正确的数字较高”,如果您猜测较高,它应该说“正确的数字较低”。这是我所拥有的: 所以很明显这是行不通的,因为如果你输入一个更小的数字,它会跳到下一个数字,即使这个数字更大,它也是正确的。那么,我如何解决这个问题,让它检查两个语句呢?抱歉解释得不好。谢了。

  • 联机-节点1,节点2离线-节点3,节点4未知-节点5,节点6

  • 假设我有一个大小为[10]的数组,当该数组被填满时,我想实现一个FIFO结构,而不是它只是填满了,因此无法向数组中添加新的东西,并抛出旧的东西。 例如,如果我有一个包含汽车制造商的字符串数组,当我的数组中有10个制造商时,我希望删除最旧的条目,添加最新的条目,但要考虑kepping FIFO。我如何在这样的方法中实现它:

  • 你好Stack overflow社区, 我的提示是:**“您将进行错误检查,以确保输入的小时在[0,23]范围内。继续询问用户,直到用户输入有效范围内的时间。 当我的程序有正确的整数输入(任何整数输入)时,它将正常工作。然而,如果我输入一个非整数,那么所有的东西都卡在一个无限循环中。 我做错了什么?

  • 我想以小批量遍历ArrayList。 例如,如果ArrayList大小为75,批大小为10,我希望它处理记录0-10,然后10-20,然后20-30,依此类推。 我试过这个,但没有成功: