Java:仅在选择正确的菜单项时,才通过阵列列表继续迭代

Java: Continuing iteration through an arraylist only when the right menu item is selected

我正在尝试创建一个控制台应用程序,每次选择正确的菜单项时,该应用程序都会遍历一个 arrayList of meal ideas。问题是我似乎无法在每次选择正确的菜单项时继续迭代,它只是重新启动循环。

Scanner in = new Scanner(System.in);
ArrayList<String> meals = new ArrayList<String>();
meals.add("pasta");
meals.add("potatoes");
meals.add("pork");
String select = "";    

while(!select.equals("q")){
    System.out.println("What would you like to do?");
    System.out.println("\t 1. See next suggestion.");
    System.out.println("\t 2. <Another option>");
    System.out.println("\t 3. <Another option>");
    select = in.next();

    switch(select){
        case "1":
            //Here's where the problem is:
            int nextIdea = 0;
            while(){
                System.out.println("\tToday: " + meals.get(nextIdea));
                nextIdea++;
                break;
            }
            System.in.read();
            break;
    }

}

用户选择显示每日选择后,应显示列表中的第一项,然后返回到 "What would you like to do menu",然后下次用户在菜单中选择选项 1 时应显示菜单中的下一项,而是重新启动循环。我知道这是因为计数器变量 ("nextIdea") 每次在循环执行之前都设置为零,但是我怎样才能让它记住上次使用的是哪个 arrayList 索引号,然后在下次用户选择查看时使用它每日一餐。只有在遍历列表中的所有项目后,列表才应重置为 0。

任何帮助将不胜感激,谢谢!!

首先,像您提到的那样在 while 循环之外实例化 nextIdea。

然后,包含一个简单的 if 语句来检查 nextIdea 是否已到达末尾,如下所示:

while(true)
{
    if (nextIdea < meals.size())
    {
        System.out.println("\tToday: " + meals.get(nextIdea));
        nextIdea++;
    }

    else
    {
       nextIdea = 0;
    }

    break;
}

你在 while 循环中没有条件,所以我假设你的意思是 'true' 这意味着它会 运行 无限直到中断。

虽然,从技术上讲,这里的循环并没有真正做任何事情,因为它只是 运行s 一次并中断,所以你可以像这样摆脱它:

if (nextIdea < meals.size())
{
    System.out.println("\tToday: " + meals.get(nextIdea));
    nextIdea++;
}

else
{
   nextIdea = 0;
}

我认为您需要仔细考虑您真正想要实现的目标是什么以及实现此目标的最佳方法是什么。

欢迎随时问我更多问题。

您需要将 nextIdea 索引移出第一个循环。然后您也不必在用户选择 "See next suggestion." 时迭代列表 - 您只需显示下一个想法:

int nextIdea = 0;
while(!select.equals("q")){
    System.out.println("What would you like to do?");
    System.out.println("\t 1. See next suggestion.");
    System.out.println("\t 2. <Another option>");
    System.out.println("\t 3. <Another option>");
    select = in.next();

    switch(select){
        case "1":
            System.out.println("\tToday: " + meals.get(nextIdea));
            nextIdea++;
            System.in.read();
            break;
    }
}

所以,基本上,您不需要内部循环来迭代膳食创意。您已经使用外部循环进行了迭代:每次用户选择菜单项 #1 时,您都会向她展示下一个想法。

您还应确保 nextIdea 始终是数组列表中的有效索引。类似于:

case "1":
    if(nextIdea >= meals.size()) {
        nextIdea = 0;
    }
    System.out.println("\tToday: " + meals.get(nextIdea));
    nextIdea++;
    System.in.read();
    break;