📜  在 Kotlin 中按指定的比较器对列表进行排序

📅  最后修改于: 2022-05-13 01:55:02.713000             🧑  作者: Mango

在 Kotlin 中按指定的比较器对列表进行排序

众所周知,对列表进行排序是对列表进行的最常见的操作之一,因此在本文中,我们将讨论如何在 Kotlin 中通过指定的比较器对列表进行排序。当我们尝试对自定义对象列表进行排序时,我们需要指定比较器。让我们看看如何通过指定的比较器对列表进行排序。

Kotlin 比较器

Kotlin 提供了一个 Comparator 接口来对用户定义类的对象进行排序。有两种方法可以创建 Comparator 对象:

  • 使用 compareBy() (然后使用 thenBy() 比较更多字段)
  • 创建自定义比较器

如果要反转比较器的顺序(例如,按降序排序),只需使用 reversed()。

例子

在以下示例中,我们将尝试根据某些属性对对象进行排序。这将使我们了解如何根据指定的比较器进行排序。让我们创建一个具有 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) }
}