【问题标题】:How to make the loop run again if boolean is false如果布尔值为假,如何使循环再次运行
【发布时间】:2014-10-30 07:31:28
【问题描述】:

我的问题是当 boolean 为 false 时它仍然返回 i 并将其放在数组 lotto 中。如何修复它,以便当 boolean 为 false 时,它​​会丢弃 i 并为该元素运行另一个随机数。

package LottoNumbers;

import java.util.Arrays;

public class LottoNumbers {
//check for duplicates in each array

    public static boolean isFound(int[] lotto, int number) {
        for (int i = 0; i < lotto.length; i++) {
            if (lotto[i] == number ) {
                return true;

            }
        }
        return false;
          //DO SOMETHING IF FALSE THAT WILL GET RID OF THE NUMBER

    }

    public static void main(String[] args) {

        //specify length of array
        int[] lotto = new int[6];
        //determine how many arrays
        for (int Set = 1; Set <= 5; Set++) {
            //assign random numbers to each array element
            for (int i = 0; i < lotto.length; i++) {
                int number= 0;
                isFound(lotto, number = (int) (Math.random() * 50));
                lotto[i] = number;

            }
              Arrays.sort(lotto);


            //sort elements in array 
            //Sort arrays to specified Set numbers
            if (Set == 1) {
                System.out.printf("LOTTO Numbers for set 1 --> ");

            } else if (Set == 2) {
                System.out.print("LOTTO Numbers for set 2 --> ");

            } else if (Set == 3) {
                System.out.print("LOTTO Numbers for set 3 --> ");

            } else if (Set == 4) {
                System.out.print("LOTTO Numbers for set 4 --> ");

            } else if (Set == 5) {
                System.out.print("LOTTO Numbers for set 5 --> ");

            }

            System.out.printf(Arrays.toString(lotto).replace("[", "").replace(",", "").replace("]", "") + "\n");

        }
    }
}

【问题讨论】:

  • 我希望只在 boolean 返回 true 时填写 lotto[]。
  • 下面的解决方案对您有帮助吗?
  • 我不能使用数组列表来完成这个任务。不管我的 for 循环多么无用,这是一个要求。 ://
  • 没关系 - 我也包含了一个使用数组和 for 循环的解决方案。
  • 我正在尝试找出解决方案。

标签: java loops methods


【解决方案1】:

我不完全确定你想要做什么——你实际上并没有对 isFound 返回的布尔值做任何事情。但是,如果您要问是否只能在 isFound 评估为 true 时分配 lotto[i],您可以这样做的一种方法是更改​​ for 循环,如下所示:

for (int i = 0; i < lotto.length; i++) {
    int number;
    Boolean wasFound = isFound(lotto, number = (int) (Math.random() * 50));

    if (!wasFound)
    {
        lotto[i] = number;
    }
    else
    {
        // perform the previous iteration again
        i--;
    }
}

您的设计效率不高或设计精良 - 您指望生成一个以前从未见过的随机数,如果您已经创建的数字越多,它的性能就会显着变差。一个更好的方法是只取一个预先存在的非重复整数集合中的一个元素:

// define numbersArrayList as { 1, 2, 3, 4, ... n }
ArrayList<int> yourLottoNumbers = new ArrayList<int>()
for (int i = 0; i < yourLimit; i++)
{
    int randomIndex = (int)(Math.random() * numbersArrayList.length()) - 1;
    int newNumber = numbersArrayList[randomIndex];
    yourLottoNumbers.add(newNumber);
    yourLottoNumbers.remove(randomIndex);
}

此代码的执行时间与您需要获取的元素数量成正比,而不是完全随机的时间,而且您无需重复 for 循环。

【讨论】:

  • int newNumber = numbersArrayList[randomIndex];可能会给 arrayIndexOutOfBound 异常。
  • 现在应该可以解决了。
  • 事实上你应该用 numbersArrayList 的大小来修改它,我会说。
【解决方案2】:

如果函数为假,您不希望函数循环,因为那样函数将永远不会结束。

public static boolean IsFound(int number)
{
    //You don't need to pass the array, because it's a class level variable
    for (int i = 0; i < lotto.length; i++)
    {
        if (lotto[i] == number)
            return true;
        return false;
    }
}

完成此操作后,您可以简单地执行以下操作来添加到您的数组中:

for (int i = 0; i < lotto.length; i++)
{
    int randomNumber = (Math.random() * 50);
    while(IsFound(randomNumber))
    {
        randomNumber = (Math.random() * 50);
    }
    lotto[i] = randomNumber;
}

【讨论】:

  • 谢谢,我也发现了问题。我只需要在上面的方法中切换我的布尔值 true 和 false。我还对我的代码提出了以前的海报建议,这是问题的另一部分。
猜你喜欢
  • 2018-11-03
  • 2013-02-21
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
相关资源
最近更新 更多