2011-08-29 57 views
9

我正在學習如何在Java中使用Arrays.sort(...)如何使用Java Arrays.sort

爲什麼變數:tempdopas都排序後只有排序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 

我期望的dopa保持未排序。

回答

22

數組是Java中的對象,因此當使用數組變量時,實際上是使用對數組的引用。

因此,線

float[] temp=dopas; 

將僅在參考複製到陣列dopas。之後,dopastemp指向相同的數組,因此在使用sort()之後,兩者都會顯示排序。使用System.arrayCopyArrays.copyOf來創建數組的副本。

3

因爲在Java中,您通過引用訪問數組,而不是by-value。因此tempdopas都是對同一個數組的引用。

+1

+1因爲您是第一個回答:) – Fortega

2

當您指定temp的值爲dopas時,它不會進行復制,它會使變量引用相同的數組。

3

爲什麼在Array.sort後,兩個數組都被排序?

因爲只有一個數組。 float[] temp=dopas;不會創建新的數組或複製現有的數組內容。它只是複製一個數組參考 ...這樣你就可以在兩個地方引用相同的數組。

1

因爲temp和dopas都是相同的。作業temp=dopas;分配對數組的引用。它不會複製其內容。這就是爲什麼當你排序第一的時候你也排序第二。

0

temp和dopas共享相同的指針,因爲您不需要創建數組的新實例,只需指定相同的指針即可。

1

dopastemp指的是相同的陣列並且可以互換使用。

float[] temp=dopas; 

這條線後,temp[i]將是完全一樣dopas[i]

1

由於溫度和dopas是兩個引用同一個數組

2

由於溫度和dopas(我們稱之爲變量)是指向內存中的空間。通過使用代碼

float[] temp = dopas 

你剛纔說讓「TEMP」指向內存中的同一空間dopas一樣。所以結果是你有兩個指向內存中相同空間的指針。並通過區分臨時你被引用dopas在您選擇的代碼後,你所訪問的完全相同的數據排序是空間的內容,這樣。

PS:Dogmatixed提到一個解決您的問題。

7

你的任務:float[] temp=dopas;實際上只是複製對數組的引用。我認爲你想要做的是float[] temp = dopas.clone();

+0

+1解決方案 – Chris

6

temp只是對dopas的參考。內存中實際上只有一個數組。

如果你想temp是的dopas副本,請嘗試:

float[] temp = Arrays.copyOf(dopas, dopas.length); 

這樣一來,你會深拷貝您的陣列,而不是淺拷貝吧!

1

temp引用了dopas,所以當dopas得到排序時,temp也是如此。它們實際上指向相同的array.hope,這有助於。

0

temp and dopas正在引用相同的數組。

如果你想讓temp像一個新的數組,然後用clone()方法。

float[] temp = dopas.clone(); 

clone()方法創建新的數組並複製dopas到新創建的數組的內容。