【问题标题】:Generate a number and check if it is already in a ArrayList生成一个数字并检查它是否已经在 ArrayList 中
【发布时间】:2015-04-24 13:16:22
【问题描述】:

我想生成 10 个随机数。但是在向 ArrayList 添加数字之前,我需要检查我的 Arraylist 是否已经包含一个介于 randomNumber - 50randomNumber + 50 之间的数字。

例如,如果随机数是 120:
120-50=70
120+50=170

如果 ArrayList 包含 70 到 170 之间的数字,我不会将它添加到我的 ArrayList 并再次运行循环...

我的代码有什么问题?

package ee.tlu;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Testing {
    public Testing() {
        List < Integer > numbers = new ArrayList < > ();
        Random rand = new Random();
        int number = rand.nextInt(5000);
        int n = 0;
        boolean listis = false;
        numbers.add(number);
        while (n < 10) {
            number = rand.nextInt(5000);
            for (int k = number - 50; k < number + 50; k++) {
                if (numbers.contains(k)) {
                    listis = true;
                    break;
                }
            }
            if (!listis) {
                numbers.add(number);
                n += 1;
            }
        }
        System.out.println(numbers);
    }
    public static void main(String[] args) {
        new Testing();
    }
}

【问题讨论】:

  • 请解释您的问题。预期结果是什么,实际结果是什么。
  • 发生什么样的错误?
  • 预期结果是 10 个随机数的列表,这些随机数在数组中,两个数字之间的距离至少为 50 个单位。例如 5, 560, 4444, 140, 219, 300, 1000, 390, 900, 2555。但是这个是坏的:5, 40, 100, 101, 300, 300, 500, 600, 7, 45。 , Eclipse 有时运行有时不运行...
  • @Bubletan 有正确的答案。除此之外,您应该考虑在numbers 上循环,而不是在number - 50number + 50 之间的所有整数上循环。

标签: java random arraylist numbers


【解决方案1】:

在开始 while 循环之前声明 listis。一旦设置为 true,它就永远不会重置。将其移到循环内。

此外,您永远不会检查 number + 50,因为您的 for 循环中有 &lt; 而不是 &lt;=

while (n < 10) {
    boolean listis = false;
    number = rand.nextInt(5000);
    for (int k = number - 50; k <= number + 50; k++) {
        if (numbers.contains(k)) {
            listis = true;
            break;
        }
    }
    if (!listis) {
        numbers.add(number);
        n += 1;
    }
}

【讨论】:

    【解决方案2】:

    我不确定这是否是唯一的问题,但您应该在 while 循环的每次迭代中重置您的 listis 标志:

        while (n < 10) {
            listis = false; // added
            number = rand.nextInt(5000);
            for (int k = number - 50; k < number + 50; k++) {
                if (numbers.contains(k)) {
                    listis = true;
                    break;
                }
            }
            if (!listis) {
                numbers.add(number);
                n += 1;
            }
        }
    

    否则,当您第一次发现不应该添加的数字时,您将停止添加任何数字。

    【讨论】:

      【解决方案3】:

      我会递归地执行此操作。我没有测试下面的代码,只是记事本上的一个快速模型。但希望这会有所帮助。

      public class Testing {
      
          public List < Integer > numbers = new ArrayList < > ();
      
          public Testing() {
      
              Random rand = new Random();
              int number = rand.nextInt(5000);
      
              // initial number in arraylist
              numbers.add(number);
      
              // add 9 more numbers to arraylist
              addNumbers(9);
      
              System.out.println(numbers);
          }
      
          public void addNumber(int amountLeft){
              int newNumber = rand.nextInt(5000);
      
              if(isValidNumberToAdd(newNumber))
              {
                  numbers.add(newNumber);
              }
      
              if(amountLeft == 0)
              {
                  return;
              }
      
              addNumber(amountLeft--);
          }
      
          public boolean isValidNumberToAdd(int newNumber)
          {
              Iterator<int> numbersIterator = numbers.iterator();
              while (numbersIterator.hasNext()) {
                  int number = numbersIterator.next();
                  if(newNumber > number - 50 && newNumber < number + 50)
                  {
                      return false;
                  }
              }
      
              return true;
          }
      
          public static void main(String[] args) {
              new Testing();
          }
      }
      

      【讨论】:

        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 2015-07-12
          • 1970-01-01
          • 1970-01-01
          • 2021-11-10
          • 2013-01-18
          • 1970-01-01
          • 2020-07-07
          • 2020-08-28
          • 2021-07-13
          相关资源
          最近更新 更多