2013-09-27 55 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);