2011-08-29 6 views
9

私はArrays.sort(...)がJavaでどのように動作するかについて学習しています。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 

ドーパが未分類のままであることが予想されました。

答えて

22

配列はJavaのオブジェクトであるため、配列変数を使用する場合、実際には配列への参照を使用しています。

したがって

float[] temp=dopas; 

ラインのみアレイdopasから参照をコピーします。その後、dopastempは同じ配列を指しているため、両方ともsort()を使用した後にソートされたように見えます。

System.arrayCopyまたはArrays.copyOfを使用してアレイのコピーを作成します。

3

ため、Javaで、あなたはないによって値によって参照配列にアクセスします。

したがってtempおよびdopasは、両方とも同じアレイへの参照です。

+1

あなたが最初に答えたので+1: – Fortega

2

tempに値dopasを割り当てると、コピーが作成されず、変数が同じ配列を参照します。

3

なぜArray.sortの後に両方の配列がソートされるのですか?

アレイが1つのみであるためです。 float[] temp=dopas;は、新しい配列を作成したり、既存の配列の内容をコピーしたりしません。配列参照 ...をコピーするだけで、2つの場所で同じ配列への参照を持つことができます。

1

tempとdopaの両方の配列が同じであるためです。代入temp=dopas;は、配列への参照を代入します。そのコンテンツはコピーされません。これは、あなたが最初のものを並べ替えるときに2番目のものを並べ替える理由です。

0

tempとdopasは同じポインタを共有します。これは、配列の新しいインスタンスを作成しないので、同じポインタを割り当てるだけです。

1

dopasおよびtempは、同じアレイを指し、互換的に使用することができる。この行の後

float[] temp=dopas; 

temp[i]dopas[i]とまったく同じになります。

1

TEMPとdopas同じアレイ

2

TEMPとdopasは(私たちは、変数を呼んでいるもの)、メモリ内のスペースへのポインタであるために2つの参照があるため。コードを使用して

float[] temp = dopas 

あなたはちょうどドーパと同じメモリ空間を指していると言います。その結果、メモリ内の同じ領域に2つのポインタがあることになります。また、tempをソートすることで、そのスペースの内容をソートするので、後であなたが同じデータにアクセスしているコードで、後でドーパを参照します。

PS:Dogmatixedは問題の解決策を述べました。

7

あなたの割り当て:float[] temp=dopas;は、実際には配列への参照をコピーしています。あなたがしたいと思うのは、float[] temp = dopas.clone();

+0

+1解決策 – Chris

6

tempは、単にdopasへの参照です。実際にはメモリ内に1つの配列しかありません。

あなたはtempdopasのコピーになりたい場合は、試してみてください。

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

この方法で、あなたは深いコピーではなく浅いコピーあなたの配列ますそれ!

1

tempはdopasを参照しています。したがって、dopasがソートされると、tempも同じ配列を参照しています。これは役に立ちます。

0

温度およびドーパは、同じアレイを参照している。

tempを新しい配列のように動作させたい場合は、clone()メソッドを使用してください。

clone()メソッドは、新しい配列を作成し、新たに作成された配列にドーパの内容をコピーします。

関連する問題