2013-09-27 33 views
0

我有一个包含N个元素的列表,我想随机化它的顺序。重新排序列表以在Java中随机化其订单

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

到目前为止,我想出了:

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

对我来说似乎最便宜的是第三种选择,但我不确定结果是多么随意。有什么建议么?

回答

2

洗牌清单的最佳方法是使用标准库方法Collections.shuffle

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

如果你想自己做,在Fisher-Yates shuffle algorithm读了。

+0

即使他不是最快的,他是最清楚的,我感谢他的链接。完善。 – Daren

1

其他人已经提到过关于洗牌,但如果您使用gwt,则不支持洗牌,您可能必须对其进行编码。这里有一个方法:

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);