在 Kotlin 中按指定的比较器对列表进行排序
众所周知,对列表进行排序是对列表进行的最常见的操作之一,因此在本文中,我们将讨论如何在 Kotlin 中通过指定的比较器对列表进行排序。当我们尝试对自定义对象列表进行排序时,我们需要指定比较器。让我们看看如何通过指定的比较器对列表进行排序。
Kotlin 比较器
Kotlin 提供了一个 Comparator 接口来对用户定义类的对象进行排序。有两种方法可以创建 Comparator 对象:
- 使用 compareBy() (然后使用 thenBy() 比较更多字段)
- 创建自定义比较器
如果要反转比较器的顺序(例如,按降序排序),只需使用 reversed()。
Read more here: Comparator in Kotlin
例子
在以下示例中,我们将尝试根据某些属性对对象进行排序。这将使我们了解如何根据指定的比较器进行排序。让我们创建一个具有 age 属性的 Person 类。我们将根据年龄对人员对象列表进行排序:
Kotlin
fun main (args: Array){
val p1=Person (91)
val p2=Person (10)
val p3=Person (78)
val listOfPerson= listof (pl, p2, p3)
var sortedListOfPerson=listOfPerson.sortedBy {
it.age
}
}
class Person (var age: Int)
Kotlin
fun main (args: Array) {
val p1=Person (91)
val p2=Person (10)
val p3=Person (78)
val listOfPerson = listOf (pl, p2, p3)
var sortedListOfPerson = listOfPerson.sortedBy {
it.age
}
}
class Person (var age: Int)
Kotlin
fun main (args: Array){
val pi=Person (91)
val p2=Person (10)
val p3=Person (78)
val listofPerson = listOf (pl, p2, p3)
var sortedListOfperson = listofperson
.sortedWith (object : Comparator {
override fun compare (p0: Person, pi: Person) : Int {
if (p0.age > pl.age) {
return 1
}
if (p0.age = pl.age) {
return 0
}
return -1
}
})
}
class Person (var age: Int)
Kotlin
public inline fun > Iterable . sortedBy (crossinline
selector: (T) -> R?) : List {
return sortedWith (compareBy (selector) )
}
Kotlin
public fun Iterable.sortedWith(comparator: Comparator) :
List {
if (this is Collection) {
if (size <= 1) return this.toList ()
@Suppress ("UNCHECKED_CAST")
return (toTypedArray () as Array).apply {
sortWith (comparator) }.asList ()
}
return toMutableList ().apply { sortWith (comparator) }
}
要根据指定的比较器对列表进行排序,我们需要使用sortedBy函数
科特林
fun main (args: Array) {
val p1=Person (91)
val p2=Person (10)
val p3=Person (78)
val listOfPerson = listOf (pl, p2, p3)
var sortedListOfPerson = listOfPerson.sortedBy {
it.age
}
}
class Person (var age: Int)
Kotlin 还提供了 sortedwith 方法,您可以在其中指定自己的比较器实现:
科特林
fun main (args: Array){
val pi=Person (91)
val p2=Person (10)
val p3=Person (78)
val listofPerson = listOf (pl, p2, p3)
var sortedListOfperson = listofperson
.sortedWith (object : Comparator {
override fun compare (p0: Person, pi: Person) : Int {
if (p0.age > pl.age) {
return 1
}
if (p0.age = pl.age) {
return 0
}
return -1
}
})
}
class Person (var age: Int)
sortedBy函数是 Kotlin 提供的语法糖。在内部,它被称为接受比较器的sortedWith方法。现在,让我们看看 sortBy函数的实现:
科特林
public inline fun > Iterable . sortedBy (crossinline
selector: (T) -> R?) : List {
return sortedWith (compareBy (selector) )
}
sortBy函数调用里面的sortedwith方法,如下:
科特林
public fun Iterable.sortedWith(comparator: Comparator) :
List {
if (this is Collection) {
if (size <= 1) return this.toList ()
@Suppress ("UNCHECKED_CAST")
return (toTypedArray () as Array).apply {
sortWith (comparator) }.asList ()
}
return toMutableList ().apply { sortWith (comparator) }
}