Java - получить случайный элемент/элемент из списка

Java - получить случайный элемент / элемент из списка

1. Вступление

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

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

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

Ключевым моментом здесь является помнить, что вы не должны использовать индекс, превышающий вашу емкостьList’s.

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. Заключение

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

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