2011-10-29 169 views
5

我有一個2D數組,我想基於第二列進行排序。第一列應該與第二列保持配對。基於列排序2D整數數組

二維陣列最初如下(2×10矩陣):

​​

我想上述二維數組進行排序這樣的:

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); 

任何幫助將不勝感激。謝謝!

編輯:只發布我的代碼的其餘部分,看看問題是否在其他地方。

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]); 
    } 
} 

編輯2:

我找到了工作。謝謝大家的幫助。我有多個Sort()函數(一個不工作的較老的函數,以及上面看到的那個函數),事實證明我打錯了一個,儘管我認爲我改變了這個調用。那是其中的一個。

如果您想排序數組,請隨意使用上面的代碼。它現在正在全力運作。

+0

該代碼不應該運行;數組的數組有一個單一的數組,其中包含一組兩個元素的數組,當您打印數組時,將其視爲一個由兩個十元數組組成的數組。 –

+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