Maison > Questions et réponses > le corps du texte
大家讲道理2017-04-18 10:09:02
for (int i=size; i>1; i--)
swap(list, i-1, rnd.nextInt(i));
shuffle
brouille l'ordre de la liste, utilise Random
pour générer un index (nombre aléatoire) et échange les éléments de i-1
avec l'index aléatoire. Boucle collection.size()
fois.
PHP中文网2017-04-18 10:09:02
Pour ce genre de problème, il suffit de regarder le code source.
@SuppressWarnings({"rawtypes", "unchecked"})
public static void shuffle(List<?> list, Random rnd) {
int size = list.size();
if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
for (int i=size; i>1; i--)
swap(list, i-1, rnd.nextInt(i));
} else {
Object arr[] = list.toArray();
// Shuffle array
for (int i=size; i>1; i--)
swap(arr, i-1, rnd.nextInt(i));
ListIterator it = list.listIterator();
for (int i=0; i<arr.length; i++) {
it.next();
it.set(arr[i]);
}
}
}
Ce qui précède est le code source du JDK. La méthode principale est la suivante shuffle
, avec quelques commentaires supprimés.
Obtenez d'abord le nombre d'éléments dans l'ensemble. S'il est inférieur à 5 ou implémente l'interface RandomAccess
, il bouclera à nouveau et échangera aléatoirement les positions de deux éléments adjacents dans l'ensemble RandomAccess
est une marque. Si elle est implémentée, avoir cette interface signifie prendre en charge des opérations d'accès aléatoire rapides, similaires aux tableaux.
S'il y a plus ou égal à 5 éléments et que l'interface RandomAccess
n'est pas implémentée, alors elle sera convertie en tableau, puis elle bouclera également, échangeant aléatoirement les positions de deux éléments adjacents dans l'ensemble , et enfin remettez le tableau au list
Medium d'origine.
大家讲道理2017-04-18 10:09:02
Il s'agit d'un brassage aléatoire "approximatif" de la collection. Le principe est très simple. Il est basé sur un générateur de nombres aléatoires et interagit de manière aléatoire avec l'ordre des éléments de la collection.