繁体   English   中英

在方法中对变量所做的更改在主方法 JAVA 中未更改

[英]Changes made to variables in a method not changing in the main method JAVA

我首先要说我对 Java 很陌生,我在 python 方面有合理的经验,但 Java 对我来说还很陌生。

我的问题是我创建了一种方法来确保 4 个随机数彼此都是唯一的,我通过使用 while 循环比较每个可能的组合来做到这一点。

我可以看到我的代码有效

public static void EqualValues(int num1, int num2, int num3, int num4) {
    Random ran = new Random();
    while(num1 == num2 || num1 == num3 || num1 == num4) {
        num1 = ran.nextInt(9);
        num1 += 1;
    }
    while(num2 == num1 || num2 == num3 || num2 == num4) {
        num2 = ran.nextInt(9);
        num2 += 1;
    }

    while(num3 == num1 || num3 == num2 || num3 == num4) {
        num3 = ran.nextInt(9);
        num3 += 1;
    }
    while (num4 == num1 || num4 == num2 || num4 == num3) {
        num4 = ran.nextInt(9);
        num4 += 1;
    }

    System.out.println(num1);
    System.out.println(num2);
    System.out.println(num3);
    System.out.println(num4);
    System.out.println(".........");
}

这将输出 4 个唯一数字,即:2 6 8 4

但是,当我在我的主要方法中做同样的事情时:

public static void main(String[] args) {

    Random ran = new Random();

    int num1 = ran.nextInt(9);
    int num2 = ran.nextInt(9);
    int num3 = ran.nextInt(9);
    int num4 = ran.nextInt(9);

    num1 += 1;
    num2 += 1;
    num3 += 1;
    num4 += 1;

    EqualValues(num1, num2, num3, num4);

    System.out.println(num1);
    System.out.println(num2);
    System.out.println(num3);
    System.out.println(num4);
}

在检查之前,我得到了四个原始数字,即:2 6 4 4

如果有人能指出我哪里出错了。 我希望我已经描述了我的问题,以便于理解。

会发生以下情况:当您将变量传递给EqualValues (您应该将其重命名为equalValues以遵循约定)时,它实际上会收到它们的“副本”,它无法修改。 有两种方法可以解决这个问题:

1 - 您可能在数组中返回修改后的值。

2 - 您不传递任何参数,而是将您的变量声明为静态并让该方法直接访问它们。

但是,我建议完全采用另一种方法:将Set对象传递给您的方法。 这样,该方法将只修改您的Set内容,并且它还将为您处理重复(因为Set只允许唯一值),因此您的代码会更清晰。

例子:

private static final Random RNG = new Random();

private static void fillWithRandoms(Set<Integer> set) {
    while(set.size() < 4) {
        int rando = RNG.nextInt(9) + 1;
        set.add(rando);
    }
}

public static void main(String[] args) {
    Set<Integer> set = new HashSet<Integer>();

    fillWithRandoms(set);

    System.out.println(set);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM