Pourquoi Collections.shuffle() échoue pour mon tableau?
Pourquoi mon code ne fonctionne pas?
package generatingInitialPopulation;
import java.util.Arrays;
import java.util.Collections;
public class TestShuffle {
public static void main(String[] args) {
int[] arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
Collections.shuffle(Arrays.asList(arr));
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
Le résultat est: 0 1 2 3 4 5 6 7 8 9.
Je m'attendais à un mélangées au hasard séquence.
Vous devez vous connecter pour publier un commentaire.
Arrays.asList()
ne peut pas être appliquée à des tableaux de type primitif comme vous vous attendez. Lorsqu'il est appliqué àint[]
,Arrays.asList()
produit une liste deint[]
s au lieu de la liste desInteger
s. Par conséquent, vous shuffle une liste nouvellement créée deint[]
.C'est un subtil comportement de variadic arguments et les génériques en Java.
Arrays.asList()
est déclarée commeAlors, il peut prendre plusieurs arguments de certains type de
T
et de produire une liste contenant ces arguments, ou il peut prendre un argument de typeT[]
et de retourner une liste soutenue par ce tableau (c'est comment variadic arguments de travail).Cependant, cette dernière option ne fonctionne que lorsque
T
est un type de référence (c'est à dire pas un type primitif commeint
), parce que seuls les types de référence peuvent être utilisés comme paramètres de type dans les génériques (etT
est un type de paramètre).Donc, si vous passez
int[]
, vous obtenezT
=int[]
, et vous le code ne fonctionne pas comme prévu. Mais si vous passez tableau de type de référence (par exemple,Integer[]
), vous obtenezT
=Integer
et tout fonctionne:Arrays.asList()
retourneList<T>
, mais vous ne pouvez pas déclarerList<int>
en Java.Essayez d'ajouter cette ligne de code pour votre test:
Vous verrez que vous imprimez à partir d'un seul élément
List
.À l'aide de
Arrays.asList
sur une primitive de la matrice de causeasList
pour traiter laint[]
comme un seul objet plutôt qu'un tableau. Elle renvoie uneList<int[]>
au lieu d'unList<Integer>
. Donc, vous êtes fondamentalement aléatoire d'un seul élémentList
et donc rien de vraiment mélangés.Avis que certaines des réponses déjà donné tort parce
asList
renvoie une Liste soutenue par le tableau d'origine, rien n'est copié - toutes les modifications sont reflétées dans le tableau original.Object
s en Java et je pense que les arguments deasList(T...)
est interprétée comme un simple d'un seulObject
, depuisasList
ne s'attend pas à des primitives.Qui ne fonctionne pas parce que l'appel à
shuffle
sur leList
retourné parArrays.asList
, pas sur le tableau. Ainsi, lorsque vous parcourez la matrice pour imprimer les valeurs, rien n'a changé. Ce que vous voulez faire est d'enregistrer une référence à laList
retourné parArrays.asList
, et ensuite imprimer les valeurs de laList
(plutôt que les valeurs de la matrice) après vousshuffle
il.Arrays.asList()
est faite à l'ensemble lui-même - la liste utilise ce tableau pour stocker les éléments. Le problème est queasList
ne peut pas créer une liste de primitives, de sorte qu'il crée une liste avec un seul élément: le tableau lui-même. Il serait travailler pour un tableau avec les non-primitives (par exemple, Integer).Stocker la liste resturned par des Tableaux.asList et shuffle qui...