【问题标题】:Reorder a List to randomize its order in Java重新排序列表以随机化其在 Java 中的顺序
【发布时间】:2013-10-03 17:41:20
【问题描述】:

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

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

到目前为止,我想出了:

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

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

【问题讨论】:

    标签: java random


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        如果您想自己动手,请阅读Fisher-Yates shuffle algorithm。

        【讨论】:

        • 接受了,尽管他不是最快的,但他是最清楚的,我感谢他的链接。完美。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多