Kotlin 中的 Pair 比较器
Comparator for Pair in Kotlin
我可以在 Kotlin 中为特殊类型编写比较器
class Comparator() : kotlin.Comparator<Pair<Double, Int>>
但是我如何使用泛型为所有可能的扩展 Comparable<...> 的类型编写比较器?
您可以创建比较器,使用帮助函数 - 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)
}
}
您可以使用以下函数将两个比较器组合成一对比较器,将一对比较器的第一个值与第一个比较器进行比较,然后将第二个值与第二个比较器进行比较:
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
我可以在 Kotlin 中为特殊类型编写比较器
class Comparator() : kotlin.Comparator<Pair<Double, Int>>
但是我如何使用泛型为所有可能的扩展 Comparable<...> 的类型编写比较器?
您可以创建比较器,使用帮助函数 - 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)
}
}
您可以使用以下函数将两个比较器组合成一对比较器,将一对比较器的第一个值与第一个比较器进行比较,然后将第二个值与第二个比较器进行比较:
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