2012-01-12 79 views
1

排序我有一個數組這樣的:根據最後一列

UserID |ItemID | Score 
    1  10  2.0 
    1  11  1.2 
    1  12  1.4 

..........

我想根據得分列數組排序。我的代碼是:

double[][] arr=new double [1000][3]; 

    int i=0;int j=0;int k=0; 
    while ((phrase = br.readLine()) != null) { 
     String[] splited =phrase.split("\t"); 
     arr[i][0]=Double.parseDouble(splited[0]); 
     i++; 
     arr[j][1]=Double.parseDouble(splited[1]); 
     j++; 
     arr[k][2]=Double.parseDouble(splited[2]); 
     k++; 
    } 


    //print(a); 
    System.out.println(); 
    Arrays.sort(arr, new java.util.Comparator<double[]>() { 
     public int compare(double[] a, double[] b) { 
      return (int)(a[1] -b[1]); 
     } 
    }); 
    print(arr); 

但它不起作用!哪裏不對?

回答

2

如果需要按第三列對其進行排序,則需要使用a[2]

public static void main(String[] args) { 
    double[][] arr = { { 1, 10, 2.0 }, { 1, 11, 1.2 }, { 1, 12, 1.4 }, }; 
    ; 
    Arrays.sort(arr, new Comparator<double[]>() { 
     public int compare(double[] o1, double[] o2) { 
      return Double.compare(o1[2], o2[2]); 
     } 
    }); 

    for (int i = 0; i < arr.length; i++) { 
     for (int j = 0; j < arr.length; j++) { 
      System.out.print(arr[i][j]); 
      System.out.print("\t"); 
     } 
     System.out.println(); 
    } 

} 
+0

另外我用return(int)(a [1] -b [1]);並不排序數組,但正如你所說我使用這個返回:return Double.compare(o1 [2],o2 [2]);它的工作原理。謝謝你 – user951487 2012-01-13 06:56:34

+0

很高興有幫助:) – 2012-01-13 22:41:08

2

如果你想通過你要比較的第二個維度,也就是2的最後指數最後列進行排序因此,你應該做的return (int)(a[2] -b[2]);而非return (int)(a[1] -b[1]);

順便說一句,你爲什麼使用3個指數i,jk?你爲什麼不用一個,例如i

編輯

重新思考比較,你不應該使用(int)(a[2] -b[2])而是Double.compare(a[2], b[2])通過@Prashant Bhate的建議。

原因是,如果兩個值之間的差值小於1或大於-1,則轉換到int將導致0,這意味着二者相等。例如:(int)(0.5 - 1.4) = (int)(-0.9) = 0

+0

但回報(INT)(A [2] B [2] );不起作用 – user951487 2012-01-13 06:57:16

+0

@ user951487你是對的,我補充說明了爲什麼Prashant Bhate的比較有效,爲什麼我的比較沒有。 – Thomas 2012-01-13 07:30:27

1

這是因爲得分列是表的第三列 - 要排序的第二列 - 即

Arrays.sort(arr, new java.util.Comparator<double[]>() { 
    public int compare(double[] a, double[] b) { 
     return (int)(a[2] - b[2]); 
    }