生成一个数字并检查它是否已经在 ArrayList 中

Generate a number and check if it is already in a ArrayList

我想生成 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();
    }
}

我不确定这是否是唯一的问题,但您应该在 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;
        }
    }

否则,第一次发现不应该相加的数字时,将停止相加。

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

此外,您永远不会检查 number + 50,因为您在 for 循环中使用 < 而不是 <=

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;
    }
}

I would do this recursively. I haven't tested the below code, just a quick mockup on notepad. But hopefully this will help.

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();
    }
}

只需使用 Set 而不是 List。套装保证: Adding new element to the set works only if new element is not already present in the set.