Как работает сортировка ArrayList пользовательских объектов? - PullRequest
0 голосов
/ 12 апреля 2020

Как этот метод list.sort () фактически сортирует объекты по их свойству. Это решение для вопроса LeetCode 1337.

class Solution {
public int[] kWeakestRows(int[][] mat, int k) {
    List<Pair> list = new ArrayList<>();
    for(int i = 0; i < mat.length; i++) {
        int cur = 0;
        for(int j = 0; j < mat[0].length; j++) {
            cur += mat[i][j];
        }
        Pair p = new Pair();
        p.index = i;
        p.count = cur;
        list.add(p);
    }

    list.sort((lh, rh) -> 
        lh.count != rh.count ? lh.count - rh.count : lh.index - rh.index
    );

    int[] ret = new int[k];
    for(int i = 0; i < k; i++) {
        ret[i] = list.get(i).index;
    }
    return ret;
}

}

class Pair {
int index;
int count;
}

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

List.sort принимает Comparator в качестве аргумента. Поскольку Pair не реализует Comparable, вы не можете использовать естественный порядок. Таким образом, здесь компаратор заменяется лямбда-выражением, и эта реализация использует свойства count и index для применения порядка.

0 голосов
/ 12 апреля 2020
list.sort((lh, rh) -> 
    lh.count != rh.count ? lh.count - rh.count : lh.index - rh.index
);

Здесь list отсортировано по предоставленному лямбда-методу, который представляет метод для определения, находится ли один элемент до или после другого элемента.

Сравнение выполняется с помощью lh.count != rh.count ? lh.count - rh.count : lh.index - rh.index. Если count обоих элементов не равны, элементы сортируются по count. Если lh.count меньше, чем rh.count, то лямбда возвращает отрицательное значение, в противном случае оно является положительным. Если count одинаково для обоих, то сравнение выполняется для index.

Полученные числа используются списком для определения порядка элементов. Лямбда реализует метод Comparator#compare. Проверьте его документацию для деталей. Отрицательное число указывает на то, что первый аргумент находится перед вторым.


Как работает сортировка ArrayList пользовательского объекта?

В общем случае путем предоставления Comparator, чтобы описать порядок пользовательских элементов, то есть, как определить, находится ли один элемент до или после другого элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...