0

我有一个包含 N 个元素的列表,我想随机化它的顺序。

最好用最少的计算,并且能够用完内存(复制总数)。

到目前为止,我想出了:

  • 创建新的空列表,从原始列表中取出第一个元素,将其插入到随机位置的新列表中,数量级似乎 O(N*N) 但不使用额外的内存。
  • 创建一个新的ArrayList(容量N)(所以访问是O(1)),创建一个新的hashSet并插入所有可能的位置(N),取出原始List的第一个元素并将其插入新的arrayList的随机位置,从 hashSet 中删除这个位置,因为 ti 已经被使用了。
  • 创建一个新的 HashSet,将所有元素添加到此 hashSet,并遍历该集合以创建一个新 List,并希望 hashSet 中的顺序是随机的。

在我看来,最便宜的是第三种选择,但我不确定结果会有多随机。有什么建议么?

4

3 回答 3

10

Collections.shuffle(list);你在找什么。

于 2013-09-27T12:16:07.820 回答
7

打乱列表的最佳方法是使用标准库方法Collections.shuffle

List lst = getListFromSomewhere();
Collections.shuffle(lst);

如果你想自己做,请阅读Fisher-Yates shuffle algorithm

于 2013-09-27T12:16:17.570 回答
1

其他人已经提到过 shuffle,但如果您使用的是 gwt,则不支持 shuffle,您可能需要对其进行编码。这是一种方法:

public static void shuffleList(final List<String> list) {

    int length = list.size();
    Random random = new Random();

    for (int i = 0; i < length; i++) {

        // Swap index
        int swap = i + random.nextInt(length - i);      

        // Store temporarily
        String temp = list.get(i);

        // Set the values
        list.set(i, list.get(swap));
        list.set(swap, temp);

    }
}

要使用,只需-

shuffleList(listOfStringsToShuffle);
于 2013-09-27T12:32:47.687 回答