Как проверить, удалить и заменить повторяющиеся значения в списке массивов? - PullRequest
0 голосов
/ 05 августа 2020

Я хотел бы сгенерировать 5 случайных чисел, и если это число уже существует, удалить его и заменить новым. Повторение процесса до тех пор, пока все сгенерированные числа не станут уникальными. Однако я застрял, так как продолжаю получать повторяющиеся значения в моем массиве.

import java.util.Random;
import java.util.ArrayList;

public class Question2_NEW
{
    public static void main (String[] args)
    {
        System.out.println("Generating 5 random numbers from 0 to 5...");

        Random rand = new Random();
        int generate = rand.nextInt((5) + 1);
        ArrayList<Integer> randomNumbers = new ArrayList<Integer>();
        
        for (int i = 0; i < 5; i++)
        {
            generate = rand.nextInt((5) + 1);
            randomNumbers.add(generate);

            while (randomNumbers.contains(generate)) 
            {
                randomNumbers.remove(randomNumbers.get(i));
                generate = rand.nextInt((5) + 1);
                randomNumbers.add(generate);
                break;
            }
        }

        for (Integer i : randomNumbers) 
        {
            System.out.println(i);
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 05 августа 2020

Напишите и вызовите этот метод в своем коде.

private boolean arrayListIncludes(Integer i, ArrayList<Integer> randomNumbers) {
    for(int x = 0; x<randomNumbers.size(); x++) {
         if(randomNumbers.get(i).intValue() == i.intValue()) {
               return true;
         }
    }
    return false;
}
      
0 голосов
/ 05 августа 2020

Если вы хотите использовать List, я бы сделал следующее:

    public static void main(String[] args) {
        System.out.println("Generating 5 random numbers from 0 to 5...");

        Random rand = new Random();
        int generate;
        List<Integer> randomNumbers = new ArrayList<Integer>();

        for (int i = 0; i <= 5; i++) {
            do {
                generate = rand.nextInt((5) + 1);
            } while (randomNumbers.contains(generate));

            randomNumbers.add(generate);
        }

        for (Integer i : randomNumbers) {
            System.out.println(i);
        }
    }

Если вы также можете использовать наборы:

    public static void main(String[] args) {
        System.out.println("Generating 5 random numbers from 0 to 5...");

        Random rand = new Random();
        Set<Integer> randomNumbers = new HashSet<Integer>();

        while (randomNumbers.size() <= 5) {
            randomNumbers.add(rand.nextInt((5) + 1));
        }

        for (Integer i : randomNumbers) {
            System.out.println(i);
        }
    }

Изменить: исправлена ​​проблема с длиной Set / ArrayList

0 голосов
/ 05 августа 2020

Это происходит потому, что внутри while l oop вы не проверяете, что номер замены не , а также уже в ArrayList. Он просто принимается без вопросов.

Лучшее решение - проверить, действителен ли номер перед тем, как вы его добавите:

    for (int i = 0; i < 5; i++)
    {
        generate = rand.nextInt((5) + 1);
        while (randomNumbers.contains(generate)) 
        {
            generate = rand.nextInt((5) + 1);
        }
        randomNumbers.add(generate);
    }

Обратите внимание, что есть более эффективные алгоритмы для этой задачи. Во-первых, проверка членства выполняется быстрее с помощью HashSet. С другой стороны, если вы просто хотите, чтобы сгенерировать случайную перестановку чисел от 1 до N, шаффл Fisher-Yates является бесспорным лучшим решением. Для чего-то такого крошечного, как 5 цифр, это, вероятно, не имеет значения.

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