IntStreamのランダム順列

ニューロン:

毎日のようにして私は、私はいくつかのランダムな順序に順序をpermutateしたいインデックス付きループ、と自分自身を見つけます。私のようなものから通常の移行

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私はそのアプローチの完全に認識していますので、私は、私自身の例では、そのソリューションを提供しています。

ウィリスブラックバーン:

これはどう?それは、すべての核心をカプセル化する以外、ほとんどあなたが持っている同じことだし、ちょうどあなたの純粋を提供します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;
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=179840&siteId=1