gpt4 book ai didi

java - IntStream 的随机排列

转载 作者:搜寻专家 更新时间:2023-10-31 19:51:46 30 4
gpt4 key购买 nike

我时不时地发现自己有索引循环,我想将其顺序排列为某种随机顺序。我通常从类似的东西过渡

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) 范围内的所有元素恰好一次


这不是 this question 的副本,因为我不想创建一个 List 并随机播放它。该解决方案具有巨大的开销,因为它使用 Integer,同时还冗余地创建和改组 List。我在自己的示例中提供了该解决方案,因此我完全了解该方法。

最佳答案

这个怎么样?它与您拥有的几乎相同,只是它封装了所有细节并且只为您提供了一个纯 IntStream。此外,它不必进行如此多的装箱和拆箱操作。

public class ShuffledIntStream {

public static IntStream to(int max) {
Random r = new Random();
int[] values = new int[max];
for (int i = 0; i < max; i++) {
values[i] = i;
}
for (int i = max; i > 1; i--) {
swap(values, i - 1, r.nextInt(max));
}
return IntStream.of(values);
}

private static void swap(int[] values, int i, int j) {
int temp = values[i];
values[i] = values[j];
values[j] = temp;
}
}

关于java - IntStream 的随机排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54771228/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com