Comment utiliser les tableaux Java.sorte
J'apprends comment Arrays.sort(...)
fonctionne en Java.
Pourquoi les variables: temp
et dopas
sont-elles toutes deux triées après le seul tri temp
?
System.out.println("Before");
for (int i = 0; i < POP; i++)
System.out.println(dopas[i]+""); //dopas is unsorted
System.out.println("After");
float[] temp=dopas;
Arrays.sort(temp); //sort temp
for (int i = 0; i < POP; i++)
System.out.println(temp[i]+" "+dopas[i]); //Both temp and dopas are now sorted
Je m'attendais à ce que dopas reste non trié.
13 answers
Les tableaux sont des objets en Java, donc lorsque vous utilisez des variables de tableau, vous utilisez en fait des références à des tableaux.
Donc la ligne
float[] temp=dopas;
Ne copiera que la référence dans le tableau dopas
. Ensuite, dopas
et temp
pointent vers le même tableau, donc les deux apparaîtront triés après avoir utilisé sort()
.
Utiliser System.arrayCopy
ou Arrays.copyOf
pour créer une copie du tableau.
Votre affectation: float[] temp=dopas;
ne fait que copier une référence au tableau. Ce que je pense que vous voulez faire est float[] temp = dopas.clone();
temp
est tout simplement une référence à dopas
. Il n'y a en fait qu'un seul tableau en mémoire.
Si vous voulez temp
pour être une copie de dopas
, essayez:
float[] temp = Arrays.copyOf(dopas, dopas.length);
De cette façon, vous allez copier en profondeurvotre tableau au lieu de copier en profondeur!
Car en Java, vous accédez aux tableaux par référence, pas par valeur.
Donc temp
et dopas
sont toutes deux des références au même tableau.
Pourquoi après le tableau.trier les deux tableaux sont triés?
Car il n'y a qu'un seul tableau. float[] temp=dopas;
ne crée pas de nouveau tableau ni ne copie le contenu des tableaux existants. Il copie simplement un tableau référence ... pour que vous ayez la référence au même tableau à deux endroits.
Lorsque vous attribuez à temp
la valeur de dopas
, il ne fait pas de copie, il fait référence aux variables au même tableau.
Parce que temp et dopas (ce que nous appelons une variable) sont des pointeurs vers un espace en mémoire. En utilisant le code
float[] temp = dopas
Vous dites simplement que "temp" pointe vers le même espace en mémoire que dopas. Le résultat est donc que vous avez deux pointeurs vers le même espace en mémoire. Et en triant temp, vous triez le contenu de cet espace, donc en référençant dopas plus tard dans votre code, vous accédez exactement aux mêmes données.
PS: Dogmatixed a mentionné une solution à votre problème.
Parce que les deux tableaux temp et dopas sont les mêmes. Assignment temp=dopas;
attribue une référence au tableau. Il ne copie pas son contenu. C'est la raison pour laquelle lorsque vous triez le premier vous de tri la seconde de trop.
dopas
et temp
font référence au même tableau et peuvent être utilisés de manière interchangeable.
float[] temp=dopas;
Après cette ligne, temp[i]
sera exactement le même que dopas[i]
.
Parce que temp et dopas sont deux références au même tableau
Temp fait référence à dopas ,donc quand dopas est trié, temp aussi.Ils pointent en fait vers le même tableau.espérons que cette aide.
Temp et dopas partagent le même pointeur, puisque vous ne créez pas de nouvelle instance de tableau, vous affectez simplement le même pointeur.
temp et dopas font référence à la même matrice.
Si vous voulez que temp agisse comme un nouveau tableau, utilisez la méthode clone().
float[] temp = dopas.clone();
La méthode Clone() crée un nouveau tableau et copie le contenu du dopas dans le tableau nouvellement créé.