shuffle multidimensional List,ArrayList,LinkedList
正如我们所知,洗牌ArrayList
可以用方法Collections.shuffle
完成。shuffle multidimensional List,ArrayList,LinkedList
但是,这是如何与多维顺序收集工作?
,如果我有一个模式如下:
1,2,3 4,5,6
7,8,9
我要实现的是这样的:
1,5,7 2,3,8
9,4,6
Collection.shuffle()只交换或者行或列,但我想完全独立地交换所有元素。
不是我想要的:
1,3,2 5,6,4
7,9,8
回答:
如果你只需要调用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));
}
回答:
如果你想要做一个深刻的洗牌,我会推荐一种方法来检查列表中的每个项目是否是另一个列表,并递归地对该列表进行随机洗牌。类似这样的:
public static void deepShuffle(List<?> mutliDimensionList) { for (Object item : mutliDimensionList) {
if (item instanceof List) {
deepShuffle((List<?>)item);
}
}
Collections.shuffle(mutliDimensionList);
}
您可以添加多线程来潜在地提高ForkJoinPool或类似的性能。这完全取决于你的用例。
编辑此答案不再适用于编辑的问题。但是,当单独的子列表需要独立改组时,它应该可以工作。
以上是 shuffle multidimensional List,ArrayList,LinkedList 的全部内容, 来源链接: utcz.com/qa/266392.html