2011-10-29 9 views
5

2番目の列に基づいて並べ替える2D配列があります。最初の列は、2番目の列とペアを維持する必要があります。次のように列に基づいた2D整数配列の並べ替え

2Dアレイは、(2×10行列)最初である:

​​

Iは、上記2次元アレイは、このようなソートされたい:今

4 15 
9 12 
8 11 
0 10 
5 10 
1 9 
2 9 
3 9 
7 8 
6 4 

、私が試してみましたこのコードにSort a two dimensional array based on one column:からの回答を適応することは

Arrays.sort(theArray, new Comparator<Integer[]>() 
{ 
    @Override 
    public int compare(Integer[] int1, Integer[] int2) 
    { 
     Integer numOfKeys1 = int1[1]; 
     Integer numOfKeys2 = int2[1]; 
     return numOfKeys1.compareTo(numOfKeys2); 
    } 
}); 

しかし、配列をソートしていないようですまったく。 sort()関数を呼び出した後に配列を出力すると、配列は初期の順序になります。

私はまたここから答えを適応させようとしました:sorting 2D array of String in javaしかし私は同じ問題に遭遇しました。

これらのソリューションを適用する際にいくつかの致命的な間違いを犯しましたか?

また、この配列を降順でソートするにはどうすればよいですか? compare()のreturn文をこの行に置き換えることはできますか?

return -numOfKeys2.compareTo(numOfKeys1); 

ご協力いただければ幸いです。ありがとう!

EDIT:問題が他の場所にあるかどうかを確認するために残りのコードを投稿するだけです。

public void Sort() 
{ 
    Integer[][] theArray = {{0,10},{1,9},{2,9},{3,9},{4,15},{5,10},{6,4},{7,8},{8,11},{9,12}};; 

    dump(theArray); 
    Arrays.sort(theArray, new Comparator<Integer[]>() 
    { 
     @Override 
     public int compare(Integer[] int1, Integer[] int2) 
     { 
      Integer numOfKeys1 = int1[1]; 
      Integer numOfKeys2 = int2[1]; 
      return numOfKeys1.compareTo(numOfKeys2); 
     } 
    }); 

    System.out.println("===="); 
    dump(theArray);  
} 

public void dump(Integer[][] array) 
{ 
    for(int p = 0, q = 10; p < q; p++) 
    { 
     System.out.println(array[p][0] + " " + array[p][1]); 
    } 
} 

EDIT 2:

私が働いてそれを持っています。みんなあなたの助けをありがとう。私は複数の並べ替え()関数(以前は動作していなかったもの、上記のもの)を持っていましたが、呼び出しを変更したとは思っていましたが、間違ったものを呼び出していました。その日のうちの1つ。

配列をソートする場合は、上記のコードを自由に使用してください。今は完全に機能しています。

+0

このコードは実行しないでください。配列の配列には2つの要素の配列の束を持つ単一の配列があります。それを印刷するときに2つの10要素配列の配列として扱います。 –

+0

あなたは正しいです、私は私の指数が混ざっていました。私を修正してくれてありがとう。そして、あなたの助けに感謝します。 – Drake

答えて

1

それは私のために正常に動作します。元のcompareToまたはを無効にするには、変数をスワップします。

表示されている内容を見ている理由を理解するには、残りのコードを参照する必要があります。私はあなたのコードをそのまま切り取って貼り付けたので、問題は他のところにあります。


dump(theArray); 
Arrays.sort(theArray, new Comparator<Integer[]>() { 
    public int compare(Integer[] int1, Integer[] int2) { 
     Integer numOfKeys1 = int1[1]; 
     Integer numOfKeys2 = int2[1]; 
     return numOfKeys1.compareTo(numOfKeys2); 
    } 
}); 
System.out.println("================"); 
dump(theArray); 


0 10 
0 10 
1 9 
2 9 
3 9 
4 15 
5 10 
6 4 
7 8 
8 11 
9 12 
================ 
6 4 
7 8 
1 9 
2 9 
3 9 
0 10 
0 10 
5 10 
8 11 
9 12 
4 15 
+0

私のsort()関数をテストしてくれてありがとう。今度は残りのコードを投稿します。 – Drake

+0

良い説明。 – gurubelli

1

コードはあまりにも私のために動作します。面倒なコードを残念に思って、私はすぐにテストをしなければなりませんでした。よろしく!

import java.util.*; 

class arraysort { 

    public static Integer[][] mysort(Integer[][] ar) { 
     Arrays.sort(ar, new Comparator<Integer[]>() { 
      @Override 
      public int compare(Integer[] int1, Integer[] int2) { 
       Integer numOfKeys1 = int1[1]; 
       Integer numOfKeys2 = int2[1]; 
       return numOfKeys1.compareTo(numOfKeys2); 
      } 
     }); 
     return ar; 
    } 

    public static void main(String[] s) { 
     Integer[][] myarr = {{0, 10}, {1, 9}, {2, 9}, {3, 9}, {4, 15}, {5, 10}, {6, 4}}; 

     for (Integer[] i : myarr) { 
      System.out.println(i[0] + "," + i[1]); 
     } 

     myarr = mysort(myarr); 

     for (Integer[] i : myarr) { 
      System.out.println(i[0] + "," + i[1]); 
     } 
    } 
} 
+0

ありがとうございます、プログラムは現在動作しています。 – Drake

0

私はあなたのコードを完全に実行しました...一つのことしかし、私はそれ以外の場合は、境界の例外のうち、配列のインデックスを与えるので、コードを実行するために

System.out.println(array[p][0] + " " + array[p][1]); 

System.out.println(array[0][p] + " " + array[1][p]); 

を交換しなければなりませんでした。

compareToの戻り値を無効にすると、値をスワップするより簡単になり、簡単に変更できます。

+0

ありがとう、私の指数は混ざりました。私のプログラムは今働いている。 – Drake

関連する問題