2012-01-12 4 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

+0

рад быть полезным :) –

2

Если вы хотите отсортировать по столбцу последний вы должны сравнить последний индекс во втором измерении, которое 2. Таким образом, вы должны сделать return (int)(a[2] -b[2]);, а не return (int)(a[1] -b[1]);.

Btw, почему вы используете 3 индикатора i, j и k? Почему бы вам просто не использовать его, например? i?

Edit:

Переосмысление сравнение, вы не должны использовать (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

но возвращение (целое) (а [2] -b [2]); не работает – user951487

+0

@ user951487 Вы правы, я добавил объяснение, почему сравнение Prashant Bhate работает и почему мой нет. – Thomas

1

Это потому, что колонка оценка является третьей колонке таблицы - вы сортировочного на второй колонке - т.е.

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