Сортировать по последнему столбцу - PullRequest
1 голос
/ 12 января 2012

У меня есть такой массив:

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

Но это не работает! что не так?

Ответы [ 3 ]

2 голосов
/ 12 января 2012

Вам нужно использовать 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();
    }

}
2 голосов
/ 12 января 2012

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

Кстати, почему вы используете 3 индекса i, j и k? Почему бы вам просто не использовать один, например 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.

1 голос
/ 12 января 2012

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

    Arrays.sort(arr, new java.util.Comparator<double[]>() {
    public int compare(double[] a, double[] b) {
        return (int)(a[2] - b[2]);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...