t.me/atinfo_chat Telegram группа по автоматизации тестирования

Рандомный обход элементов без повторений

Теги: #<Tag:0x00007f748950a190> #<Tag:0x00007f748950a000> #<Tag:0x00007f7489509f38> #<Tag:0x00007f7489509df8> #<Tag:0x00007f7489509cb8>

Добрый день.

Есть повторяющиеся элементы (в <tr>) в который содержится checkbox (как в почте, например GMail). Мне нужно рандомно обойти элементы. Когда генерируется случайное число - оно может повториться в цикле и отметить уже отмеченный элемент.

Например, список из 20 элементов. Должно отметиться 5 случайных элементов. И случайно элемент с каким-то индексом выпал 2 раза. Т.е. по факту будет отмечено 4 элемента. Решил для этого сохранять в <List> уже выбранные элементы, только как-то не хочет работать и, имхо, не красивое решение (создавать целый массив для этого и совершать доп. операции!). Код:

count = random.nextInt(maxCount);
System.out.println("rand is: " + count);

for (int i = 1; i <= count; i++) {
            int index = random.nextInt(maxCount);
            setCheckBoxStatus(elements.get(index), true);
}

Как можно сделать более красивое и менее ресурсозатратное решение?

Спасибо.

используйте метод remove для работы с массивом, то есть при взятии елемента, удаляйте его из массива

На сколько я знаю в java нету метода remove для работы с массивами

int[] removed = ArrayUtils.removeElement(intArray, 3);

Тогда стек машину, или FIFO на java нельзя реализовать?

Можно сделать костылём не красивым но не трудозатратным не проблемным.

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

Так можно, но вроде как человек хочет что бы всё проще было

используйте shuffle для массива от 0 до 20, и забирайте первых 5 элементов

3 Симпатий
        Collections.shuffle(list);
        list.stream()
            .limit(count)
            .forEach(element -> doSomeAction(element));
3 Симпатий