while() 循环的问题

Problems with while() loop

while循环System.out.println("Value of i before loop = " + i);开始之前的语句没有被打印,循环中i的值也没有从1开始打印。而是从一个随机的大开始打印整数

package main;

import java.util.Random;

public class Main {
    public static void main(String args[]){

        Random ran = new Random();

        int[] in = {2,5,9};
        int[] c_gen = new int[3];
        int i = 0;

        System.out.println("Value of i before loop = " + i);

        while(!(c_gen.equals(in))){
            c_gen[0] = ran.nextInt(10);
            c_gen[1] = ran.nextInt(10);
            c_gen[2] = ran.nextInt(10);
            i++;
            System.out.println(c_gen[0] + " " + c_gen[1] + " " + c_gen[2] + "    .................." + i);
        }

        System.out.print("in = ");
        for(int x : in)
            System.out.print(x + " ");

        System.out.print("\n" + "c_gen = ");
        for(int x : c_gen)
            System.out.print(x + " ");

        System.out.println("\n" + "i = " + i);
    }
}

我得到:

Value of i before loop = 0
2 2 1    ..................1
2 2 4    ..................2
...

建议您重新构建项目并重试。

正如最初发布的那样,您的代码不会终止,因为 int[].equals(int[]) 不会按照您的预期进行。

不过你可以试试这个。

private static boolean equals(int[] a, int[] b) {
    if (a == null && b == null) {
        // Both null
        return true;
    }
    if (a == null || b == null) {
        // One null
        return false;
    }
    if (a.length != b.length) {
        // Differ in length.
        return false;
    }
    for (int i = 0; i < a.length; i++) {
        if (a[i] != b[i]) {
            // Mismatch
            return false;
        }
    }
    // Same.
    return true;
}


public void test() {
    Random ran = new Random();

    int[] in = {2, 5, 9};
    int[] c_gen = new int[3];
    int i = 0;

    System.out.println("Value of i before loop = " + i);

    while (!equals(c_gen, in)) {
        c_gen[0] = ran.nextInt(10);
        c_gen[1] = ran.nextInt(10);
        c_gen[2] = ran.nextInt(10);
        i++;
        System.out.println(c_gen[0] + " " + c_gen[1] + " " + c_gen[2] + "    .................." + i);
    }

    System.out.print("in = ");
    for (int x : in) {
        System.out.print(x + " ");
    }

    System.out.print("\n" + "c_gen = ");
    for (int x : c_gen) {
        System.out.print(x + " ");
    }

    System.out.println("\n" + "i = " + i);
}

您直接比较数组导致无限循环。这些结果正在印刷中,但将成为大量产出的重中之重。修正你的比较。

Sotirios 的直觉是正确的 - 您的错误在行 while(!(c_gen.equals(in))) 中。您不能使用 .equals(...) 方法比较数组是否相等,因为 "arrays inherit their equals-method from Object, [thus] an identity comparison will be performed for the inner arrays, which will fail, since a and b do not refer to the same arrays." (source)。因此,因为 c_genin 将始终引用不同的数组(即使它们的内容相同),您的循环将永远进行下去。

请尝试 Arrays.equals(..)

public static void main(String[] args) {
    Random ran = new Random();

    int[] in = {2,5,9};
    int[] c_gen = new int[3];
    int i = 0;

    System.out.println("Value of i before loop = " + i);

    while(!Arrays.equals(in, c_gen)){

        c_gen[0] = ran.nextInt(10);
        c_gen[1] = ran.nextInt(10);
        c_gen[2] = ran.nextInt(10);
        i++;
        System.out.println(c_gen[0] + " " + c_gen[1] + " " + c_gen[2] + "    .................." + i);
    }

    System.out.print("in = ");
    for(int x : in)
        System.out.print(x + " ");

    System.out.print("\n" + "c_gen = ");
    for(int x : c_gen)
        System.out.print(x + " ");

    System.out.println("\n" + "i = " + i);

}

这对我有效(在有限时间内终止),示例输出:

Value of i before loop = 0
1 9 9    ..................1
5 4 1    ..................2
1 1 6    ..................3
1 3 6    ..................4
.... //Omitted because of space
6 5 8    ..................1028
2 5 9    ..................1029
in = 2 5 9 
c_gen = 2 5 9 
i = 1029