Время от времени я оказываюсь с индексированными циклами, для которых я хочу переставить порядок в некоторый случайный порядок.Я обычно перехожу из чего-то вроде
for (int i = 0; i < max; i++) {
// do stuff with i
}
в
List<Integer> indices = IntStream.range(0, max)
.boxed()
toCollection(() -> new ArrayList(max)));
Collections.shuffle(indices);
for (int i = 0; i < max; i++) {
int index = indices.get(i);
// do stuff with index
}
Это не эффективно и не элегантно.Можно ли создать Stream
(в идеале IntStream
) в определенном диапазоне, но вернуть ли его элементы в случайном порядке?Я думаю о чем-то вроде:
IntStream.range(0, max)
.shuffled() // this method doesn't exist
.forEach(IntConsumer::accept);
Результирующий IntStream
должен по-прежнему включать все элементы в диапазоне [0, max)
точно один раз .
Это не дубликат этого вопроса , потому что я не хочу создавать List
и перемешивать его.Это решение имеет значительные накладные расходы, поскольку оно работает с Integer
s, а также создает и перетасовывает List
с избыточностью.Я представил это решение в своем собственном примере, поэтому я полностью осознаю этот подход.