Выражения объектов Kotlin: пример компаратора

этот код в основном сортирует массив в порядке убывания:

val arrayList = arrayListOf(1, 5, 2)

Collections.sort(arrayList, object : Comparator<Int> {
   override fun compare(x : Int, y: Int) = y - x
})

как в мире переопределение метода compare с y - x работает? Откуда Котлин знает, что y - x означает y до x если y < x?

3 ответов


это на самом деле не имеет ничего общего с Котлин. Это связано с интерфейсом компаратора Java API и коллекциями how.сортировка использует его.

С документация:

сравнивает два аргумента для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, поскольку первый аргумент меньше, равно или больше, чем второй.

теперь давайте попробуем это для тех аргументов, которые вы дали:

  • 1-5 = -4 (отрицательное целое число), поэтому 1 меньше 5.
  • 5-2 = 3 (положительное целое число), поэтому 5 больше 2.
  • etc...

Collections.sort ничего не знает о том, что y-x средства. Он просто уважает определенный контракт интерфейса компаратора, который также должен уважать любой исполнитель (если он хочет работать).

так уж случилось, что y - x - это реализация, которая делает уважай этот контракт, потому что математика.


поскольку компаратор является интерфейсом SAM, вы можете написать этот код более кратким, используя лямбда:

Collections.sort(arrayList, {x : Int, y: Int -> y - x})

или даже

Collections.sort(arrayList) {
    x, y -> y - x
}

С лямда-последний параметр sort функция и тип данных x и y можно сделать вывод.


взятие двух объектов и определение для них одного целого числа является абстракцией определения сортировки. Вы в основном указываете, в каком порядке эти элементы будут выложены, если сортированный.

для сортировки целых чисел это может показаться излишним, но подумайте о необходимости сортировки более сложных объектов, например экземпляров класса Car.

этот класс имеет colorCode и вы хотите отсортировать:

Collections.sort(cars) {
    car1, car2 -> car1.colorCode - car2.colorCode
}

вот как вы бы определили порядок для этих объектов абстрактным способом.


в Котлине вы также можете сортировать элементы с помощью функций расширения Kotlin collections сортировка, сортировка, сортировка .... и т. д.

val arrayList = arrayListOf(1, 5, 2).sorted() //1,2,5

или

val arrayList = arrayListOf(1, 5, 2).sortedDescending() //5,2,1