即使呼叫中断,循环也在运行;

时间:2014-03-03 04:46:50

标签: java arrays loops

好的,所以我有这个服务器创建一个随机生成的数组,然后告诉用户删除一个数字。但是我添加了一个部分,这样如果用户选择一个不在数组中的数字,那么它会告诉他们再次选择...它成功告诉用户不在数组中并再次选择然后它只允许我输入在没有继续程序的情况下自由编号...这是我的代码,这是我得到的回复

    import java.util.Random;
    import java.util.Scanner;
    public class Server {
        public static boolean checked = false;
        public static int removed;
        public static int inserted;
        public static int index;
        public static int[] array =  new int[50];
        public static void generateArray(){
            Random random = new Random();
            for(int i=0; i<array.length; i++){
                int x = random.nextInt(101);
                if(x>0){
                    array[i]= x;}
                else{
                    i--;}
                for (int j=0; j < i; j++) {
                    if (array[i] == array[j]) {
                        i--;
                    }
                }

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

        public static void insertRemove(){
            Scanner input = new Scanner(System.in);
            if(checked == false){
                System.out.println("Select a number to be removed.");
                checked = true;
            }
            removed = input.nextInt();
            Server.checkValid();
            if(checked == true){
                System.out.println("Select a new number to be inserted.");
                inserted = input.nextInt();
                System.out.println("Select an index for the number to be inserted at.");
                index = input.nextInt();
            }
        }
    public static void checkValid(){
        boolean repeat = false;
        loop:
        for(int i=0; i<array.length; i++){
            for(int j=0; j<array.length; j++){
            if(array[i] == removed){
                checked = true;
                Server.insertRemove();
            }
            else{
                System.out.println("That number isn't in the array.");
                checked = false;
                repeat = true;
                if(checked == false){
                    break loop;
                }
                else{}
            }
            }
        }
        if(repeat == true){
            Server.insertRemove();
        }
    }
}

响应
由于else... break;,它也只检查数组的第一个数字,但是如果我使用for(int j=0; j<array.length j++)进行双循环,那么它将打印That number isn't in the array. 50次。

43 27 62 44 85 15 61 17 59 20 84 73 60 49 26 54 41 5 64 96 32 68 86 7 52 53 47 19 58 18 70 74 50 28 38 91 89 1 36 42 78 45 97 57 9 29 55 2 40 90 
Select a number to be removed.
0
That number isn't in the array.
Select a number to be removed.
43
43
43  // <----as you can see it's still allowing me to just type in 43
43

有一种主要的方法可以调用它......

public class Main {
    public static void main(String[] args){
        Server.generateArray();
        Server.insertRemove();
    }
}

基本上我怎么能修复当前允许我插入数字的循环,这样如果我插入不在数组中的东西那么实际上在数组中的东西那么它将允许我继续正常的程序并问我一个要插入的数字,要插入的索引等

2 个答案:

答案 0 :(得分:3)

你的'包含'逻辑中有一个常见的初学者错误。它看起来像这样:

for(/* elements in array */){
    if(/* check one element */){
        // do contains action
    } else {
        // do not contains action
    }
}

它不起作用,因为它只检查数组中的第一个元素。 'else'动作需要在循环之后。需要在检查整个阵列后完成。

(这个错误也是为什么它在删除中断时重复'not in the array'消息,因为它为每个不匹配的数字输入else子句。)

但更重要的是,使用state来管理这两种方法并不好。你有一个看起来像这样的模式:

method1 calls method2
    if not method2 call method1
        method1 calls method2
            method2 completes normally
        ...also returns to method1
    ...also returns to method2
...also returns to method1

这种混乱的逻辑造成了一个错误,即你的状态变量checked永远不会被重置。在最后粘贴checked = false;语句可能会纠正错误,但在这里我建议重写。

更结构化的方法就是这样,使用do-while循环来验证输入:

public static void insertRemove() {
    Scanner in = new Scanner(System.in);
    int selection;
    do {
        selection = in.nextInt();
    } while(!checkValid(selection));

    // selection is now valid so do whatever you need to
}

public static boolean checkValid(int selection) {
    for(int i = 0; i < array.length; i++) {
        if(array[i] == selection) {
            return true;
        }
    }

    return false;
}

checkValid返回索引可能也很有用。如果找到了号码,您将返回i或在结尾处返回-1以表示未找到该号码。这样可以更方便地执行替换。它可以像这样重写:

public static void insertRemove() {
    Scanner in = new Scanner(System.in);
    int selection;
    int index;
    do {
        selection = in.nextInt();
        index = getIndexOf(selection);
    } while(index < 0);

    // ask user for a new number
    selection = in.nextInt();
    array[index] = selection;
}

非常有条理,更容易理解。

答案 1 :(得分:1)

正如您在java中所做的那样,可以使用Breaking out of nested loops in Java中所示的标签来突破嵌套循环 你可以在想要破解的循环级别使用标签

public class Test {
  public static void main(String[] args) {
    outerloop:
    for (int i=0; i < 5; i++) {
      for (int j=0; j < 5; j++) {
        if (i * j > 6) {
          System.out.println("Breaking");
          break outerloop;
        }
        System.out.println(i + " " + j);
      }
    }
    System.out.println("Done");
  }
}