2013-04-15 3 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

кода [Кнут перетасовка] (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 ответа

Для замены любого типа объекта (а не только Integer)

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); 
    } 
Смежные вопросы