どのように効率的にJavaでシャッフル2Dリストに?

Shiva_adsule:

私は、リスト上の1から16までのランダムな値を持つ2Dリストを作成する必要があります。私は、関数を呼び出すたびに、それは私に1〜16の値の2Dリストを与える必要があります。

私はこの方法でこれを行っています

public List<List<Integer>> shuffle() {
    List<List<Integer>> ls = new ArrayList<>();
    ls.add(Arrays.asList(0, 0, 0, 0));
    ls.add(Arrays.asList(0, 0, 0, 0));
    ls.add(Arrays.asList(0, 0, 0, 0));
    ls.add(Arrays.asList(0, 0, 0, 0));
    Random rand = new Random();
    int x = 1, a, b;
    while (x < 17) {
        a = rand.nextInt(4);
        b = rand.nextInt(4);
        if (ls.get(a).get(b) == 0) {
            ls.get(a).set(b, x);
            x++;
        }
    }
    return ls;
}

この機能16の要素2Dリストを作成するための平均テイク75のループは、他の方法が効率的にそれを行うことですか?

フライング:

あなたのメソッド名がすでに行われなければならないものを提案しています。代わりに、セットに次のインデックスを推測するだけの要素をシャッフルします。あなたが値をシャッフルしている場合は、単に2次元のリストにそれらをスライスすることができます。

public List<List<Integer>> create4x4RandomMatrix() {
    List<Integer> ints = IntStream.rangeClosed(1, 16).boxed().collect(Collectors.toList());
    Collections.shuffle(ints);
    List<List<Integer>> matrix = new ArrayList<>();
    for (int i = 0; i < 4; i++) {
        matrix.add(ints.subList(i * 4, (i + 1) * 4));
    }
    return matrix;
}

それは固定された4×4行列であるので@Holgerは静的にそれを作成する権利です。

public List<List<Integer>> create4x4RandomMatrix() {
    List<Integer> ints = IntStream.rangeClosed(1, 16).boxed().collect(Collectors.toList());
    Collections.shuffle(ints);
    return Arrays.asList(ints.subList(0, 4), ints.subList(4, 8),
            ints.subList(8, 12), ints.subList(12, 16));
}

おすすめ

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