Jest to metoda zestawu SDK, której szukasz: Collect.shuffle (Arrays.asList (tablica));
Louis Hong
2
@Louie Nie, to nie działa. To stworzyłoby List<int[]>jeden wpis. Zobacz moją odpowiedź dotyczącą sposobu osiągnięcia tego celu za pomocą Collections.shuffle().
Duncan Jones
2
Naprawdę nie jest to odpowiedź na pierwotne pytanie, ale MathArrays.shuffle z biblioteki commons-math3 spełnia swoje zadanie.
sandris
1
Nie jest to wystarczająco tematyczne, aby uzasadnić odpowiedź, ale pamiętam naprawdę fajny artykuł z książki „Graphics Gems”, który mówił o przemierzaniu tablicy w pseudolosowej kolejności. Moim zdaniem to przede wszystkim bicie musiało tasować dane. Implementacja C znajduje się tutaj github.com/erich666/GraphicsGems/blob/master/gems/Dissolve.c
Używanie kolekcji do przetasowania szeregu prymitywnych typów to trochę przesada ...
Wystarczy samodzielnie zaimplementować tę funkcję, używając na przykład tasowania Fisher – Yates :
import java.util.*;import java.util.concurrent.ThreadLocalRandom;classTest{publicstaticvoid main(String args[]){int[] solutionArray ={1,2,3,4,5,6,16,15,14,13,12,11};
shuffleArray(solutionArray);for(int i =0; i < solutionArray.length; i++){System.out.print(solutionArray[i]+" ");}System.out.println();}// Implementing Fisher–Yates shufflestaticvoid shuffleArray(int[] ar){// If running on Java 6 or older, use `new Random()` on RHS hereRandom rnd =ThreadLocalRandom.current();for(int i = ar.length -1; i >0; i--){int index = rnd.nextInt(i +1);// Simple swapint a = ar[index];
ar[index]= ar[i];
ar[i]= a;}}}
Niezwykle trywialny nitpick, ale możesz go użyć println()zamiast println(""). Myślę, że jaśniejsze w intencji :)
Cowan
55
O wiele lepiej byłoby użyć Collections.shuffle (Arrays.asList (array)); a następnie tasować siebie.
Louis Hong
21
@Louie Collections.shuffle(Arrays.asList(array))nie działa, ponieważ Arrays.asList(array)zwraca Collection<int[]>nie Collection<Integer>tak, jak myślałeś.
Adam Stelmaszczyk,
15
@exhuma Ponieważ jeśli masz tablicę tysięcy lub milionów prymitywnych wartości do sortowania, zawijanie każdego z nich w celu wykonania sortowania jest nieco kosztowne, zarówno w pamięci, jak i procesorze.
PhiLho,
14
To nie jest tasowanie Fisher-Yates. Nazywa się to tasowaniem Durstenfelda . Oryginalny losowy losowanie rybaków trwa w czasie O (n ^ 2), który jest bardzo wolny.
Pacerier
164
Oto prosty sposób użycia ArrayList:
List<Integer> solution =newArrayList<>();for(int i =1; i <=6; i++){
solution.add(i);}Collections.shuffle(solution);
Możesz po prostuCollectons.shuffle(Arrays.asList(solutionArray));
FindOutIslamNow
@Timmos Mylisz się. Arrays.asList otacza oryginalną tablicę, a jej modyfikacja modyfikuje oryginalną tablicę. Dlatego nie można dodawać ani usuwać, ponieważ tablice mają stały rozmiar.
Nand
@Nie jestem pewien, o czym myślałem, ale patrząc na kod źródłowy, w rzeczywistości metoda Arrays.asList tworzy ArrayList wspierany przez podaną tablicę. Dzięki za zwrócenie na to uwagi. Usunąłem mój poprzedni komentarz (nie mogłem go edytować).
Timmos
100
Oto działająca i wydajna funkcja losowania tablicy Fisher-Yates:
privatestaticvoid shuffleArray(int[] array){int index;Random random =newRandom();for(int i = array.length -1; i >0; i--){
index = random.nextInt(i +1);if(index != i){
array[index]^= array[i];
array[i]^= array[index];
array[index]^= array[i];}}}
lub
privatestaticvoid shuffleArray(int[] array){int index, temp;Random random =newRandom();for(int i = array.length -1; i >0; i--){
index = random.nextInt(i +1);
temp = array[index];
array[index]= array[i];
array[i]= temp;}}
Głosowałem, ponieważ potrzebowałem rozwiązania, które nie wymagałoby dużego nakładu pracy przy tworzeniu zbioru liczb całkowitych
mwk 30.09.13
2
Czy druga implementacja nie ma możliwości wymiany z własnym indeksem? random.nextInt(int bound)jest wyłączny, ale podanie go i + 1jako argumentu pozwoliłoby indexi ipotencjalnie byłoby takie samo.
bmcentee148
21
@ bmcentee148 Zamiana elementu z sobą jest dozwolona w przypadkowej kolejności. Niezrozumienie tego osłabiło Enigmę i pomogło Alanowi Turingowi go złamać. en.wikipedia.org/wiki/…
Ellen Spertus
4
xorSztuką jest dobre dla wymiany rejestrów procesora, gdy procesor nie ma instrukcji wymiany i nie ma wolnych rejestrów, ale do ciężkich elementów tablicy wewnątrz pętli, nie widzę żadnych korzyści. W przypadku tymczasowych zmiennych lokalnych nie ma powodu, aby deklarować je poza pętlą.
Holger
1
Nieco bardziej efektywne jest zadeklarowanie tempzmiennej poza pętlą. XORTrik powinien być szybszy niż przy użyciu tempzmiennej ale jedynym sposobem, aby upewnić się, że aby wykonać test porównawczy.
Dan Bray
25
Klasa Kolekcje ma wydajną metodę tasowania, którą można kopiować, aby na nią nie polegać:
/**
* Usage:
* int[] array = {1, 2, 3};
* Util.shuffle(array);
*/publicclassUtil{privatestaticRandom random;/**
* Code from method java.util.Collections.shuffle();
*/publicstaticvoid shuffle(int[] array){if(random ==null) random =newRandom();int count = array.length;for(int i = count; i >1; i--){
swap(array, i -1, random.nextInt(i));}}privatestaticvoid swap(int[] array,int i,int j){int temp = array[i];
array[i]= array[j];
array[j]= temp;}}
żeby na tym nie polegać ? Wolałbym na tym polegać, gdyby to tylko możliwe.
shmosel
@shmosel Następnie możesz go użyć. Pamiętaj, aby zaimportować wymaganą klasę i przekonwertować tablicę na listę za pomocą Arrays.asList. Trzeba również przekonwertować wynikową listę na tablicę
KitKat
Nie możesz używać Arrays.asList()prymitywnej tablicy. I nie musisz go konwertować, ponieważ jest to tylko opakowanie.
Jak korzystać z tej klasy Kolekcje w systemie Android? Aby go użyć, musisz wykonać specjalny import (CRTL SHIFT O nie działa)?
Hubert
@Hubert powinien być częścią pakietu java.util. Jest częścią standardowej biblioteki od wersji 1.2.
MauganRa
3
Aby twoja odpowiedź była bardziej samodzielna, powinna zawierać przykładowy kod. IE:import java.util.Collections; shuffle(solutionArray);
Stevoisiak,
10
Oto kompletne rozwiązanie wykorzystujące Collections.shufflepodejście:
publicstaticvoid shuffleArray(int[] array){List<Integer> list =newArrayList<>();for(int i : array){
list.add(i);}Collections.shuffle(list);for(int i =0; i < list.size(); i++){
array[i]= list.get(i);}}
Zauważ, że cierpi z powodu niezdolności Javy do płynnego tłumaczenia między int[]i Integer[](a więc int[]i List<Integer>).
Poniżej znajdują się trzy różne implementacje losowania. Z kolekcji można korzystać tylko w przypadku kolekcji. Nie ma potrzeby zawijania tablicy w kolekcję, aby ją posortować. Poniższe metody są bardzo proste do wdrożenia.
Nie mierzysz tych samych rzeczy i mierzysz je tylko raz (wtedy liczy się ich kolejność i zapominasz o optymalizacji środowiska wykonawczego). Powinieneś zadzwonić range, toArraya toPrimitiveprzed jakimkolwiek czasem, i zapętlić, aby móc cokolwiek zawrzeć (pseudo-kod: zrób kilka razy {generuj listę, arr i iarr; lista tasowania czasu; arr tasowanie czasu; tasowanie czasu iarr}). Moje wyniki: 1. miejsce list: 36017ns, arr: 28262ns, iarr: 23334ns. 100 list: 18445ns, arr: 19995ns, iarr: 18657ns. : Pokazuje tylko, że int [] jest wstępnie zoptymalizowany (według kodu), ale jest prawie równoważny z optymalizacją środowiska wykonawczego.
syme
9
Używanie ArrayList<Integer>może pomóc w rozwiązaniu problemu tasowania bez stosowania dużej logiki i pochłaniania mniej czasu. Oto, co sugeruję:
ArrayList<Integer> x =newArrayList<Integer>();for(int i=1; i<=add.length(); i++){
x.add(i);}Collections.shuffle(x);
W tym kodzie nie ma nic specyficznego dla Java8. Działa to od Java2. Cóż, zadziałałoby, gdy naprawisz niespójność między pierwszym użyciem lista nagłym nawiązaniem do cardsList. Ale ponieważ musisz utworzyć tymczasowy list, który pominąłeś, nie ma korzyści w porównaniu z Collections.shuffle(Arrays.asList(arr));podejściem pokazanym tutaj kilka razy. Co działa również od wersji Java2.
Holger
3
Oto wersja ogólna tablic:
import java.util.Random;publicclassShuffle<T>{privatefinalRandom rnd;publicShuffle(){
rnd =newRandom();}/**
* Fisher–Yates shuffle.
*/publicvoid shuffle(T[] ar){for(int i = ar.length -1; i >0; i--){int index = rnd.nextInt(i +1);
T a = ar[index];
ar[index]= ar[i];
ar[i]= a;}}}
Biorąc pod uwagę, że ArrayList jest w zasadzie tylko tablicą, może być wskazane, aby pracować z ArrayList zamiast z jawną tablicą i użyć Collections.shuffle (). Testy wydajności nie wykazują jednak żadnej istotnej różnicy między powyższym a Collections.sort ():
Shuffe<Integer>.shuffle(...) performance:576084 shuffles per second
Collections.shuffle(ArrayList<Integer>) performance:629400 shuffles per second
MathArrays.shuffle(int[]) performance:53062 shuffles per second
Implementacja Apache Commons MathArrays.shuffle jest ograniczona do int [], a spadek wydajności prawdopodobnie wynika z użycia generatora liczb losowych.
Wygląda na to, można przejść new JDKRandomGenerator()do MathArrays.shuffle. Zastanawiam się, jak to wpływa na wydajność?
Brandon
Właściwie ... to wygląda jak MathArrays#shufflema podziału w swojej podstawowej pętli: int targetIdx = new UniformIntegerDistribution(rng, start, i).sample();. Dziwaczny.
Brandon
3
Random rnd =newRandom();for(int i = ar.length -1; i >0; i--){int index = rnd.nextInt(i +1);// Simple swapint a = ar[index];
ar[index]= ar[i];
ar[i]= a;}
Nawiasem mówiąc, zauważyłem, że ten kod zwraca ar.length - 1wiele elementów, więc jeśli twoja tablica ma 5 elementów, nowa tablica będzie tasować 4 elementy. Dzieje się tak, ponieważ mówi pętla for i>0. Jeśli zmienisz na i>=0, wszystkie elementy zostaną przetasowane.
Tylko jedna głowa do góry, możesz przenieść to do sekcji komentarza w swoim pytaniu, ponieważ prawdopodobnie zostanie ono oznaczone, jeśli pozostawi jako własną odpowiedź.
Jason D
1
Wydaje się, że to odpowiada na pytanie, więc nie jestem pewien, o czym mówisz @JasonD
Sumurai8,
1
Kod jest poprawny, komentarz jest niepoprawny. Jeśli zmienisz i>0na i>=0, tracisz czas, zamieniając element 0samym sobą.
jcsahnwaldt Reinstate Monica
3
Oto rozwiązanie wykorzystujące Apache Commons Math 3.x (tylko dla tablic int []):
W niektórych odpowiedziach zauważyłem brakujące informacje, więc postanowiłem dodać nową.
Java kolekcje Arrays.asList trwa var-Arg typu T (T ...). Jeśli przekażesz prymitywną tablicę (tablicę int), metoda asList będzie wnioskować i wygenerować listę List<int[]>, która jest listą jednego elementu (jeden element jest tablicą pierwotną). jeśli przetasujesz tę listę jednego elementu, nic to nie zmieni.
Najpierw musisz przekonwertować prymitywną tablicę na tablicę obiektów Wrapper. w tym celu możesz użyć ArrayUtils.toObjectmetody z apache.commons.lang. następnie przekaż wygenerowaną tablicę do Listy i na koniec tasuj.
int[] intArr ={1,2,3};List<Integer> integerList =Arrays.asList(ArrayUtils.toObject(array));Collections.shuffle(integerList);//now! elements in integerList are shuffled!
publicList<Integer> shuffleArray(List<Integer> a){List<Integer> b =newArrayList<Integer>();while(a.size()!=0){int arrayIndex =(int)(Math.random()*(a.size()));
b.add(a.get(arrayIndex));
a.remove(a.get(arrayIndex));}return b;}
Wybierz losową liczbę z oryginalnej listy i zapisz ją na innej liście, a następnie usuń numer z oryginalnej listy. Rozmiar oryginalnej listy będzie się zmniejszał o jeden, dopóki wszystkie elementy nie zostaną przeniesione na nową listę.
Zastanawiam się nad tym bardzo popularnym pytaniem, ponieważ nikt nie napisał wersji z tasowaniem. Styl jest mocno zapożyczony Arrays.java, bo kto obecnie nie gra w technologię Java? intZawiera ogólne i implementacje.
/**
* Shuffles elements from {@code original} into a newly created array.
*
* @param original the original array
* @return the new, shuffled array
* @throws NullPointerException if {@code original == null}
*/@SuppressWarnings("unchecked")publicstatic<T> T[] shuffledCopy(T[] original){int originalLength = original.length;// For exception priority compatibility.Random random =newRandom();
T[] result =(T[])Array.newInstance(original.getClass().getComponentType(), originalLength);for(int i =0; i < originalLength; i++){int j = random.nextInt(i+1);
result[i]= result[j];
result[j]= original[i];}return result;}/**
* Shuffles elements from {@code original} into a newly created array.
*
* @param original the original array
* @return the new, shuffled array
* @throws NullPointerException if {@code original == null}
*/publicstaticint[] shuffledCopy(int[] original){int originalLength = original.length;Random random =newRandom();int[] result =newint[originalLength];for(int i =0; i < originalLength; i++){int j = random.nextInt(i+1);
result[i]= result[j];
result[j]= original[i];}return result;}
publicclassKnuth{// this class should not be instantiatedprivateKnuth(){}/**
* Rearranges an array of objects in uniformly random order
* (under the assumption that <tt>Math.random()</tt> generates independent
* and uniformly distributed numbers between 0 and 1).
* @param a the array to be shuffled
*/publicstaticvoid shuffle(Object[] a){int n = a.length;for(int i =0; i < n; i++){// choose index uniformly in [i, n-1]int r = i +(int)(Math.random()*(n - i));Object swap = a[r];
a[r]= a[i];
a[i]= swap;}}/**
* Reads in a sequence of strings from standard input, shuffles
* them, and prints out the results.
*/publicstaticvoid main(String[] args){// read in the dataString[] a =StdIn.readAllStrings();// shuffle the arrayKnuth.shuffle(a);// print results.for(int i =0; i < a.length; i++)StdOut.println(a[i]);}}
Najprostsze rozwiązanie tego losowego tasowania w szyku.
String location[]={"delhi","banglore","mathura","lucknow","chandigarh","mumbai"};int index;String temp;Random random =newRandom();for(int i=1;i<location.length;i++){
index = random.nextInt(i+1);
temp = location[index];
location[index]= location[i];
location[i]= temp;System.out.println("Location Based On Random Values :"+location[i]);}
publicstaticvoid randomizeArray(int[] arr){Random rGenerator =newRandom();// Create an instance of the random class for(int i =0; i< arr.length;i++){//Swap the positions...int rPosition = rGenerator.nextInt(arr.length);// Generates an integer within the range (Any number from 0 - arr.length)int temp = arr[i];// variable temp saves the value of the current array index;
arr[i]= arr[rPosition];// array at the current position (i) get the value of the random generated
arr[rPosition]= temp;// the array at the position of random generated gets the value of temp}for(int i =0; i<arr.length; i++){System.out.print(arr[i]);//Prints out the array}}
import java.util.ArrayList;import java.util.Random;publicclass shuffle {publicstaticvoid main(String[] args){int a[]={1,2,3,4,5,6,7,8,9};ArrayList b =newArrayList();int i=0,q=0;Random rand =newRandom();while(a.length!=b.size()){int l = rand.nextInt(a.length);//this is one option to that but has a flaw on 0// if(a[l] !=0)// {// b.add(a[l]);// a[l]=0;// // }// // this works for every no. if(!(b.contains(a[l]))){
b.add(a[l]);}}// for (int j = 0; j <b.size(); j++) {// System.out.println(b.get(j));// // }System.out.println(b);}}
Random r =newRandom();int n = solutionArray.length;List<Integer> arr =Arrays.stream(solutionArray).boxed().collect(Collectors.toList());for(int i =0; i < n-1; i++){
solutionArray[i]= arr.remove( r.nextInt(arr.size()));// randomize base on size}
solutionArray[n-1]= arr.get(0);
Jednym z rozwiązań jest użycie permutacji do wstępnego obliczenia wszystkich permutacji i zapisanych w ArrayList
Java 8 wprowadziła nową metodę ints () w klasie java.util.Random. Metoda ints () zwraca nieograniczony strumień pseudolosowych wartości int. Możesz ograniczyć liczby losowe między określonym zakresem, podając wartości minimalne i maksymalne.
Random genRandom =newRandom();int num = genRandom.nextInt(arr.length);
Za pomocą generowania liczby losowej możesz iterować przez pętlę i zamieniać się bieżącym indeksem na liczbę losową. W ten sposób możesz wygenerować liczbę losową ze złożonością przestrzeni O (1).
List<int[]>
jeden wpis. Zobacz moją odpowiedź dotyczącą sposobu osiągnięcia tego celu za pomocąCollections.shuffle()
.Odpowiedzi:
Używanie kolekcji do przetasowania szeregu prymitywnych typów to trochę przesada ...
Wystarczy samodzielnie zaimplementować tę funkcję, używając na przykład tasowania Fisher – Yates :
źródło
println()
zamiastprintln("")
. Myślę, że jaśniejsze w intencji :)Collections.shuffle(Arrays.asList(array))
nie działa, ponieważArrays.asList(array)
zwracaCollection<int[]>
nieCollection<Integer>
tak, jak myślałeś.Oto prosty sposób użycia
ArrayList
:źródło
Collectons.shuffle(Arrays.asList(solutionArray));
Oto działająca i wydajna funkcja losowania tablicy Fisher-Yates:
lub
źródło
random.nextInt(int bound)
jest wyłączny, ale podanie goi + 1
jako argumentu pozwoliłobyindex
ii
potencjalnie byłoby takie samo.xor
Sztuką jest dobre dla wymiany rejestrów procesora, gdy procesor nie ma instrukcji wymiany i nie ma wolnych rejestrów, ale do ciężkich elementów tablicy wewnątrz pętli, nie widzę żadnych korzyści. W przypadku tymczasowych zmiennych lokalnych nie ma powodu, aby deklarować je poza pętlą.temp
zmiennej poza pętlą.XOR
Trik powinien być szybszy niż przy użyciutemp
zmiennej ale jedynym sposobem, aby upewnić się, że aby wykonać test porównawczy.Klasa Kolekcje ma wydajną metodę tasowania, którą można kopiować, aby na nią nie polegać:
źródło
Arrays.asList
. Trzeba również przekonwertować wynikową listę na tablicęArrays.asList()
prymitywnej tablicy. I nie musisz go konwertować, ponieważ jest to tylko opakowanie.Spójrz na
Collections
klasęshuffle(...)
.źródło
java.util
. Jest częścią standardowej biblioteki od wersji 1.2.import java.util.Collections; shuffle(solutionArray);
Oto kompletne rozwiązanie wykorzystujące
Collections.shuffle
podejście:Zauważ, że cierpi z powodu niezdolności Javy do płynnego tłumaczenia między
int[]
iInteger[]
(a więcint[]
iList<Integer>
).źródło
Masz tutaj kilka opcji. Lista jest nieco inna niż tablica, jeśli chodzi o tasowanie.
Jak widać poniżej, tablica jest szybsza niż lista, a pierwotna tablica jest szybsza niż tablica obiektów.
Przykładowe czasy trwania
Poniżej znajdują się trzy różne implementacje losowania. Z kolekcji można korzystać tylko w przypadku kolekcji. Nie ma potrzeby zawijania tablicy w kolekcję, aby ją posortować. Poniższe metody są bardzo proste do wdrożenia.
Klasa ShuffleUtil
Główna metoda
Przetasowanie listy ogólnej
Przetasowanie tablicy ogólnej
Przetasowanie pierwotnej tablicy
Metody użytkowe
Proste metody narzędzi do kopiowania i konwertowania tablic na listy i odwrotnie.
Klasa zasięgu
Generuje zakres wartości, podobny do
range
funkcji Pythona .źródło
range
,toArray
atoPrimitive
przed jakimkolwiek czasem, i zapętlić, aby móc cokolwiek zawrzeć (pseudo-kod: zrób kilka razy {generuj listę, arr i iarr; lista tasowania czasu; arr tasowanie czasu; tasowanie czasu iarr}). Moje wyniki: 1. miejscelist: 36017ns, arr: 28262ns, iarr: 23334ns
. 100list: 18445ns, arr: 19995ns, iarr: 18657ns
. : Pokazuje tylko, że int [] jest wstępnie zoptymalizowany (według kodu), ale jest prawie równoważny z optymalizacją środowiska wykonawczego.Używanie
ArrayList<Integer>
może pomóc w rozwiązaniu problemu tasowania bez stosowania dużej logiki i pochłaniania mniej czasu. Oto, co sugeruję:źródło
Poniższy kod osiągnie losowe uporządkowanie w tablicy.
od: http://www.programcreek.com/2012/02/java-method-to-shuffle-an-int-array-with-random-order/
źródło
Możesz teraz używać Java 8:
źródło
list
a nagłym nawiązaniem docardsList
. Ale ponieważ musisz utworzyć tymczasowylist
, który pominąłeś, nie ma korzyści w porównaniu zCollections.shuffle(Arrays.asList(arr));
podejściem pokazanym tutaj kilka razy. Co działa również od wersji Java2.Oto wersja ogólna tablic:
Biorąc pod uwagę, że ArrayList jest w zasadzie tylko tablicą, może być wskazane, aby pracować z ArrayList zamiast z jawną tablicą i użyć Collections.shuffle (). Testy wydajności nie wykazują jednak żadnej istotnej różnicy między powyższym a Collections.sort ():
Implementacja Apache Commons MathArrays.shuffle jest ograniczona do int [], a spadek wydajności prawdopodobnie wynika z użycia generatora liczb losowych.
źródło
new JDKRandomGenerator()
doMathArrays.shuffle
. Zastanawiam się, jak to wpływa na wydajność?MathArrays#shuffle
ma podziału w swojej podstawowej pętli:int targetIdx = new UniformIntegerDistribution(rng, start, i).sample();
. Dziwaczny.Nawiasem mówiąc, zauważyłem, że ten kod zwraca
ar.length - 1
wiele elementów, więc jeśli twoja tablica ma 5 elementów, nowa tablica będzie tasować 4 elementy. Dzieje się tak, ponieważ mówi pętla fori>0
. Jeśli zmienisz nai>=0
, wszystkie elementy zostaną przetasowane.źródło
i>0
nai>=0
, tracisz czas, zamieniając element0
samym sobą.Oto rozwiązanie wykorzystujące Apache Commons Math 3.x (tylko dla tablic int []):
http://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/org/apache/commons/math3/util/MathArrays.html#shuffle (int [])
Alternatywnie, Apache Commons Lang 3.6 wprowadził nowe metody losowania do
ArrayUtils
klasy (dla obiektów i dowolnego typu pierwotnego).http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/ArrayUtils.html#shuffle-int:A-
źródło
W niektórych odpowiedziach zauważyłem brakujące informacje, więc postanowiłem dodać nową.
Java kolekcje Arrays.asList trwa var-Arg typu T
(T ...)
. Jeśli przekażesz prymitywną tablicę (tablicę int), metoda asList będzie wnioskować i wygenerować listęList<int[]>
, która jest listą jednego elementu (jeden element jest tablicą pierwotną). jeśli przetasujesz tę listę jednego elementu, nic to nie zmieni.Najpierw musisz przekonwertować prymitywną tablicę na tablicę obiektów Wrapper. w tym celu możesz użyć
ArrayUtils.toObject
metody z apache.commons.lang. następnie przekaż wygenerowaną tablicę do Listy i na koniec tasuj.źródło
Oto inny sposób na przetasowanie listy
Wybierz losową liczbę z oryginalnej listy i zapisz ją na innej liście, a następnie usuń numer z oryginalnej listy. Rozmiar oryginalnej listy będzie się zmniejszał o jeden, dopóki wszystkie elementy nie zostaną przeniesione na nową listę.
źródło
Proste rozwiązanie dla Groovy:
Spowoduje to losowe posortowanie wszystkich elementów listy tablic, co zarchiwizuje pożądany wynik przetasowania wszystkich elementów.
źródło
Korzystanie z Guava
Ints.asList()
jest tak proste, jak:źródło
Zastanawiam się nad tym bardzo popularnym pytaniem, ponieważ nikt nie napisał wersji z tasowaniem. Styl jest mocno zapożyczony
Arrays.java
, bo kto obecnie nie gra w technologię Java?int
Zawiera ogólne i implementacje.źródło
Jest to algorytm knuth shuffle.
źródło
Jest też inny sposób, jeszcze nie wysyłanie
w ten sposób łatwiej, zależnie od kontekstu
źródło
Najprostsze rozwiązanie tego losowego tasowania w szyku.
źródło
int[]
doInteger[]
Arrays.asList
metodyPrzetasuj
Collections.shuffle
metodąźródło
Najprostszy kod do przetasowania:
źródło
Korzystanie z losowej klasy
źródło
źródło
źródło
podobnie bez użycia swap b
źródło
Jednym z rozwiązań jest użycie permutacji do wstępnego obliczenia wszystkich permutacji i zapisanych w ArrayList
Java 8 wprowadziła nową metodę ints () w klasie java.util.Random. Metoda ints () zwraca nieograniczony strumień pseudolosowych wartości int. Możesz ograniczyć liczby losowe między określonym zakresem, podając wartości minimalne i maksymalne.
Za pomocą generowania liczby losowej możesz iterować przez pętlę i zamieniać się bieżącym indeksem na liczbę losową. W ten sposób możesz wygenerować liczbę losową ze złożonością przestrzeni O (1).
źródło
Bez losowego rozwiązania:
źródło