【问题标题】:shuffle multidimensional List, ArrayList, LinkedList洗牌多维列表,ArrayList,LinkedList
【发布时间】:2017-12-27 16:39:51
【问题描述】:

正如我们所知,改组 ArrayList 可以使用 Collections.shuffle 方法完成。

但这如何与多维顺序集合一起工作?

如果我有如下模式:

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

【问题讨论】:

  • 你期待什么结果?
  • 一个数组列表,所有元素都被随机打乱
  • 我为您修改后的问题提供了一个解决方案来扩展我的答案。
  • 问题还是一样

标签: java list arraylist collections


【解决方案1】:

如果您只是在多维列表上调用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));
}

【讨论】:

  • 我想同时洗牌子列表和洗牌每个子列表中的元素,以便所有元素都得到一个完整的新顺序。
  • 好的,那么我上面发布的一段代码就可以做到这一点。
【解决方案2】:

如果您想进行深度洗牌,我建议您检查列表中的每个项目是否是另一个列表,然后递归地洗牌该列表。像这样的:

public static void deepShuffle(List<?> mutliDimensionList) {
    for (Object item : mutliDimensionList) {
        if (item instanceof List) {
            deepShuffle((List<?>)item);
        }
    }
    Collections.shuffle(mutliDimensionList);
}

您可以使用 ForkJoinPool 或类似的东西添加多线程以潜在地提高性能。不过,这完全取决于您的用例。

编辑此答案不再适用于已编辑的问题。但是,当需要独立打乱各个子列表时,它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2018-01-30
    • 2019-02-07
    • 2015-03-25
    相关资源
    最近更新 更多