2013-04-15 51 views
1

我有一个“代币”的数组列表。我可以用整数填充它们,没问题。但是,如果不使用内置列表类,我很难随机重新排列它们。有什么建议么?如何在没有集合的情况下洗牌ArrayList

TopSpinArray<Integer> al = new TopSpinArray<Integer>(numTokens, spinSize); 

    //fills ArrayList with tokens 
    for(int i = 1; i <= numTokens; i++) { 
     al.add(i); 
    } 
+0

的[Knuth的洗牌](http://en.wikipedia.org/wiki/ Knuth_shuffle#The_modern_algorithm)很容易实现。 – Dukeling

+2

@Dukeling可能是迂腐的,但它实际上被称为* Fisher-Yates *算法。 – adrianp

+0

@adrianp作为迂腐,它[[**也**被称为Knuth洗牌]](http://en.wikipedia.org/wiki/Knuth_shuffle)。克努特更容易记住(无论如何对我来说)。 – Dukeling

回答

6

您可以使用以下代码。

public static void shuffleList(List<Integer> a) { 
    int n = a.size(); 
    Random random = new Random(); 
    random.nextInt(); 
    for (int i = 0; i < n; i++) { 
     int change = i + random.nextInt(n - i); 
     swap(a, i, change); 
    } 
    } 

    private static void swap(List<Integer> a, int i, int change) { 
    int helper = a.get(i); 
    a.set(i, a.get(change)); 
    a.set(change, helper); 
    } 

请注意,这是从下面的链接复制

http://www.vogella.com/articles/JavaAlgorithmsShuffle/article.html

希望它可以帮助

1

如果你可以洗牌类(可能因为不是一个列表:那么你可以填充一个列表,随机播放该列表,并在你的班级中添加填充数据:

final List<Integer> tempList = new ArrayList<Integer>(); 


    //fills ArrayList with tokens 
    for(int i = 1; i <= numTokens; i++) { 
     tempList.add(i);    

    } 

    Collections.shuffle(tempList); 

    for(Integer i: tempList) { 
     al.add(i); 
    } 
0

基于@Jabir答案

用于交换任何类型的对象(不只是整数)

public static <T> void shuffleList(List<T> a) { 
    int n = a.size(); 
    for (int i = 0; i < n; i++) { 
     int change = i + Random.nextInt(n - i); 
     swap(a, i, change); 
    } 
    } 

    private static <T> void swap(List<T> a, int i, int change) { 
    T helper = a.get(i); 
    a.set(i, a.get(change)); 
    a.set(change, helper); 
    } 
相关问题