如何退出嵌套循环并完成程序

时间:2019-02-04 01:00:39

标签: java arrays

我的家庭作业有问题,我碰壁了。我是一个相当新的程序员,通过嵌套循环工作使我感到困惑。我的程序正在运行,没有中断;但是,输入重复的数字后,我输入的每个数字都不会添加到列表中。

任务是: “编写一个应用程序,该应用程序输入五个数字,每个数字在10到100之间(包括10和100之间)。在读取每个数字时,仅当它不是已读取的数字的重复项时才显示它。提供“最坏的情况”,其中所有五个数字不同。请使用最小的数组来解决此问题。在用户输入每个新值后,显示输入的完整唯一值集。”

import java.util.Scanner;

public class Assignment1 
{
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        int[] array = new int[5];
        int i = 0;
        int input = 0;
        boolean repeat = false;
        int placeHolder = 0;

        while(i < array.length) //While the number of inputs is less than the array length (5) Ask the user to input a number
        {
            System.out.printf("%s%d%s", "Please enter number", (i+1), ": ");
            input = scan.nextInt();

            if((input >= 10) && (input <= 100)) //Determine if the user input is in the range of 10-100
            {
                i++;
                for(int x = 0; x < array.length; x++) //Determine if the user input is a repeat
                {
                    if(input == array[x])
                    {
                        repeat = true;
                        System.out.println(input + " has already been entered.");
                    }
                }
                if(repeat == false) //If the user input isn't a duplicate - add it to the array
                    {
                        array[placeHolder] = input;
                        placeHolder++;
                    }
            }
            else
            {
                System.out.println("Invalid number! Please input a number between 10 and 100 (Inclusive)");
            }

            for(int y = 0; y < i; y++)
            {
                if(array[y] != 0)
                {
                    System.out.print(array[y] + " ");
                }
            }
            System.out.println();
        }

    }
}

3 个答案:

答案 0 :(得分:0)

您的repeat变量永远不会重置回false,从而使循环永远不会退出。

要解决此问题,您可以在循环的每次迭代开始时将其重置:

if((input >= 10) && (input <= 100)) {
    repeat = false;  // <--- added here
    i++;
    for(int x = 0; x < array.length; x++) {           
        if(input == array[x]){
            repeat = true;
            System.out.println(input + " has already been entered.");
        }
    }
    if(repeat == false) {
        array[placeHolder] = input;
        placeHolder++;
    }
}

话虽这么说,它可能不在本学校分配的范围之内,但是将来您可以使用Set对象来简化代码。该对象将不接受重复的值,因此您可以继续向其中添加数字,直到“满”为止。

  

不包含重复元素的集合

文档:https://docs.oracle.com/javase/7/docs/api/java/util/Set.html

此外,您可以考虑使用if(!repeat)而不是if(repeat==false)。至少对我来说,结合了这种编码风格和良好的布尔变量名称,使它更易于理解。

答案 1 :(得分:0)

在大多数情况下,嵌套循环的“中断”表示设计缺陷。并非在每种情况下都如此,所以:

a)Java有一个break命令,它可以做到:打破循环/块:

public static void main(String[] args){
    for(;;){
        while(){
           break finished;
        }
        if(somecondition){
            break finished;
        }
    }
    finished:
       // here we end up whenever we break out.
}

b)简单的回报就能完成工作:

public static void main(String[] args){
    for(;;){
        while(){
           return;
        }
        // ...
        if(somecondition){
           return;
        }
    }
}

也许是另外一种方法:

boolean worker(){
    for(;;){
        while(){
           return true;
        }
        // ...
        if(somecondition){
           return false;
        }
    }
}

public static void main(String[] args){
    boolean result = worker();
    //do some finalizing or evaluate the result.
}

c)退出程序:

public static void main(String[] args){
    for(;;){
        while(){
           System.extit(0); //success
        }
        // ...
        if(somecondition){
           System.extit(1); //some error
        }
    }
}

另一种方法是异常-总是表示错误。

您选择什么取决于。

a)通常在解析器中找到

b)非常普遍,如果您提供了一个实际功能(对程序的一部分进行编码就很自然:一旦得到结果,您就返回)

c)在应用程序中很常见,可能包装了特殊的退出方法,该方法可以进行一些额外的清理。

在您的情况下,选择权取决于您,也许您真的想突破时重新考虑(文本听起来不像这样)。

(备注:这是标题为“如何退出嵌套循环并完成程序”的问题的简单而一般的答案)

答案 2 :(得分:-1)

这是因为在您插入第一个重复的数字后重复true,请添加此代码段enter image description here