あなただけの多次元リストにCollection.shuffle
を呼び出した場合、それはそのリスト内のサブリストの順番をシャッフルします。
代わりにすべてのサブリストをシャッフルしたい場合は、サブリストごとにCollection.shuffle
を呼び出す必要があります。編集した質問の後
final List<List<String>> list = Arrays.asList(
Arrays.asList("A", "B", "C"),
Arrays.asList("X", "Y", "Z"),
Arrays.asList("1", "2", "3")
);
// 1. Will shuffle the order of the sub-lists
Collections.shuffle(list);
// 2.a. Will shuffle all the sub-lists
list.forEach(sublist -> Collections.shuffle(sublist));
// 2.b. Or the same, with method reference instead of lambda
list.forEach(Collections::shuffle);
編集
要件は、すべてのサブリストのすべての要素をシャッフルしても、サブリストの間の要素をミックスすることは本当にある場合は、上記のコードでは十分ではありません。あなたが要求として
以下のコードは行いますが、それは(この場合は3
で)すべてのサブリストが同じサイズを持っていると仮定します:
// 1. Add all values in single dimension list
List<String> allValues = list.stream()
.flatMap(List::stream)
.collect(toList());
// 2. Shuffle all those values
Collections.shuffle(allValues);
// 3. Re-create the multidimensional List
List<List<String>> shuffledValues = new ArrayList<>();
for (int i = 0; i < allValues.size(); i = i + 3) {
shuffledValues.add(allValues.subList(i, i+3));
}
どのような結果が期待されますか? – bcsb1001
すべての要素が無作為にシャッフルされるarraylist –
私はあなたの適応された質問の解決策で自分の答えを広げました。 – Ward