1. введение
Выбор случайного элемента List – очень простая операция, но не столь очевидная для реализации. В этой статье мы покажем наиболее эффективный способ сделать это в различных контекстах.
2. Выбор случайного предмета/Предметов
Чтобы получить случайный элемент из экземпляра List , вам нужно сгенерировать случайный индексный номер, а затем извлечь элемент по этому сгенерированному индексному номеру с помощью метода List.get () .
Ключевой момент здесь заключается в том, чтобы помнить, что вы не должны использовать индекс, который превышает размер вашего списка .
2.1. Один Случайный Предмет
Для выбора случайного индекса можно использовать метод Random.nextInt(int bound) :
public void givenList_shouldReturnARandomElement() { ListgivenList = 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(); ListgivenList = 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(); ListgivenList = 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() { ListgivenList = Lists.newArrayList(1, 2, 3, 4, 5, 6); Collections.shuffle(givenList); int randomSeriesLength = 3; List randomSeries = givenList.subList(0, randomSeriesLength); }
3. Заключение
В этой статье мы исследовали наиболее эффективный способ извлечения случайных элементов из списка экземпляра e для различных сценариев .
Примеры кода можно найти на GitHub .