Рубрики
Без рубрики

Java – Получение случайного элемента/Элемента Из списка

Краткое и практическое руководство по выбору случайного элемента/элементов из списка в Java.

Автор оригинала: baeldung.

1. введение

Выбор случайного элемента List – очень простая операция, но не столь очевидная для реализации. В этой статье мы покажем наиболее эффективный способ сделать это в различных контекстах.

2. Выбор случайного предмета/Предметов

Чтобы получить случайный элемент из экземпляра List , вам нужно сгенерировать случайный индексный номер, а затем извлечь элемент по этому сгенерированному индексному номеру с помощью метода List.get () .

Ключевой момент здесь заключается в том, чтобы помнить, что вы не должны использовать индекс, который превышает размер вашего списка .

2.1. Один Случайный Предмет

Для выбора случайного индекса можно использовать метод Random.nextInt(int bound) :

public void givenList_shouldReturnARandomElement() {
    List givenList = Arrays.asList(1, 2, 3);
    Random rand = new Random();
    int randomElement = givenList.get(rand.nextInt(givenList.size()));
}

Вместо класса Random вы всегда можете использовать статический метод Math.random() и умножить его на размер списка ( Math.random() генерирует Double случайное значение между 0 (включительно) и 1 (исключительно), поэтому не забудьте привести его к int после умножения).

2.2. Выбор случайного индекса в многопоточной среде

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

int randomElementIndex
  = ThreadLocalRandom.current().nextInt(listSize) % givenList.size();

2.3. Выберите Случайные Элементы С Повторениями

Иногда вам может понадобиться выбрать несколько элементов из списка. Это довольно просто:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsRepeat() {
    Random rand = new Random();
    List givenList = Arrays.asList("one", "two", "three", "four");

    int numberOfElements = 2;

    for (int i = 0; i < numberOfElements; i++) {
        int randomIndex = rand.nextInt(givenList.size());
        String randomElement = givenList.get(randomIndex);
    }
}

2.4. Выбор Случайных Элементов Без Повторений

Здесь вам нужно убедиться, что элемент удален из списка после выбора:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsNoRepeat() {
    Random rand = new Random();
    List givenList = Lists.newArrayList("one", "two", "three", "four");

    int numberOfElements = 2;

    for (int i = 0; i < numberOfElements; i++) {
        int randomIndex = rand.nextInt(givenList.size());
        String randomElement = givenList.get(randomIndex);
        givenList.remove(randomIndex);
    }
}

2.5. Выбор Случайных Рядов

В случае, если вы хотите получить случайный ряд элементов, вам может пригодиться класс Collections utils:

public void givenList_whenSeriesLengthChosen_shouldReturnRandomSeries() {
    List givenList = Lists.newArrayList(1, 2, 3, 4, 5, 6);
    Collections.shuffle(givenList);

    int randomSeriesLength = 3;

    List randomSeries = givenList.subList(0, randomSeriesLength);
}

3. Заключение

В этой статье мы исследовали наиболее эффективный способ извлечения случайных элементов из списка экземпляра e для различных сценариев .

Примеры кода можно найти на GitHub .