ArrayList, цикл и реквизиты, если не может работать то, что я хочу - Java 11 - PullRequest
0 голосов
/ 09 ноября 2019

У меня проблема со сравнением чисел в списке, чтобы он не повторялся с помощью функции Random. Я хотел, чтобы числа были случайными, но можно добавить только те, которых нет в списке.

Вот мой код:

private void addToListNumber() {

int randomPosition = new Random().nextInt(5);
int maxPosition = 5;

        if (list.size() < 1) {
            list.add(1);
            addToListNumber();
        } else if (list.size() < maxPosition) {
            for (Integer integer : list) {
                if (integer == randomPosition) {
                    addToListNumber();
                }
            }
            list.add(randomPosition);
            addToListNumber();
        } else {

            for (Integer integer : list) {
                System.out.println(integer);
            }
        }
    }

Числа повторяются.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

Это происходит из-за рекурсивного вызова addToListNumber (). Для простоты и краткости позвольте мне предположить, что maxPosition = 3 Сначала вы добавляете 1 в список. Затем предположим, что randomPosition = 2, и вы добавляете 2 в список и вызываете addToListNumber (). Теперь предположим, что randomPosition = 1, затем вы снова вызываете addToListNumber () при сравнении целочисленного значения == randomPosition (здесь вы сравнили только первый элемент и он соответствует)

Теперь давайте вставим randomPosition = 3 и 3. Так как это рекурсивный вызов, при возврате к addToListNumber (), который был вызван для randomPosition = 1 (в предыдущем случае), список не окончен (список имеет {1,2,3}) здесь и только первыйЭлемент был сравнен. В конце цикла он снова вставляет 1, и ваш список становится {1,2,3,1}, следовательно, дублируется.

0 голосов
/ 09 ноября 2019

Если я правильно понимаю ваш вопрос, вы пытаетесь составить список из 5 целых чисел в случайном порядке.

Простой способ получить это - создать список упорядоченных чисел, а затем случайным образом поменять их местами.

Сначала создайте список упорядоченных чисел.

public List<Integer> createOrderedList(int size) {
    List<Integer> list = new ArrayList<>();

    for (int i = 0; i < size; i++) {
        list.add(i);
    }

    return list;
}

Затем создайте метод, который меняет местами два элемента в списке с учетом их индексов.

public void swap(List<Integer> list, int i, int j) {
    Integer hold = list.get(i);
    list.set(i, list.get(j));
    list.set(j, hold);
}

Наконец, создайте метод, который смешивает их все.

public void mix(List<Integer> list) {
    Random random = new Random();

    for (int i = 0; i < list.size(); i++) {
        swap(list, i, random.nextInt(list.size()));
    }
}

Вызовите методы в следующем порядке:

List<Integer> list = createOrderedList(5);
mix(list);

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...