Компаратор для пары в Котлине - PullRequest
0 голосов
/ 22 ноября 2018

Я могу написать компаратор для специализированных типов в Kotlin
class Comparator() : kotlin.Comparator<Pair<Double, Int>>
Но как я могу написать компаратор с использованием обобщений для всех возможных типов, расширяющих Comparable <...>?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Вы можете использовать следующую функцию для объединения двух компараторов в компаратор пар, который сравнивает первое значение пары с первым компаратором, а затем второе значение со вторым компаратором:

fun <T, U> pairComparator(
    firstComparator: Comparator<T>, 
    secondComparator: Comparator<U>
): Comparator<Pair<T, U>> = 
         compareBy(firstComparator) { p: Pair<T, U> -> p.first }
          .thenBy(secondComparator) { p: Pair<T, U> -> p.second }

Затем выиспользуйте его следующим образом:

val source = listOf(1 to 2.3, 1 to 2.0, 0 to 3.0)
val result1 = source.sortedWith(pairComparator(naturalOrder(), naturalOrder()))
println(result1)  // [(0, 3.0), (1, 2.0), (1, 2.3)]

val result2 = source.sortedWith(pairComparator(naturalOrder(), reverseOrder()))
println(result2)  // [(0, 3.0), (1, 2.3), (1, 2.0)]

См. полный код здесь: https://pl.kotl.in/BkMOzb8CX

0 голосов
/ 22 ноября 2018

Вы можете создать компаратор, используя вспомогательные функции - compareBy, compareByDescending, naturalOrder, reverseOrder https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.comparisons/index.html

Например:

val map = mapOf<Int, String>()
// ... add values to the map
val sortedMap: SortedMap<Int, String> = map.toSortedMap(compareByDescending { it })

И дляВаш случай:

val comparator = compareBy<Pair<Double, Int>> { it.first }

Пользовательский компаратор:

class CustomComparator<T: Comparable<T>> : Comparator<T> {
    override fun compare(o1: T, o2: T): Int {
        return o1.compareTo(o2)
    }
}
...