📜  Kotlin 集合排序

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

Kotlin 集合排序

在某些集合中,元素的顺序很重要。如果您使用列表,则两个列表永远不会相等,如果它们的排序不同,尽管它们具有相同的元素。在 Kotlin 中,有不同的元素排序方式。
大多数内置类型是可比较的:
-数值类型遵循数值顺序:1大于0; -2.8f 大于 -6f,以此类推。
-Char 和 String 使用字典顺序:p 大于 a;天空大于空气。
对于自定义类型,在 Kotlin 中定义了不同类型的订单。它们可以描述如下:

自然秩序

它是为从Comparable接口继承的所有类型定义的。要为任何类型定义此顺序,应使其成为Comparable的继承者。这可以使用compareTo()函数完成,该函数接受其他相同类型的元素并返回以整数值的形式更大。根据这个整数值,我们可以确定哪个对象更大。
- 正值表示接收对象更大
- 负值表示接收者 < 参数
-零表示两个对象相等。
下面是一个可用于订购由大件和小件组成的物品的类。

Java
class Items(val big: Int, val small: Int): Comparable {
    override fun compareTo(other: Items): Int {
        if (this.big != other.big) {
            return this.big - other.big
        } else if (this.small != other.small) {
            return this.small - other.small
        } else return 0
    }
}
?fun main() {   
    println(Items(1, 2) > Items(1, 3))
    println(Items(2, 0) > Items(1, 5))
}


Java
val lengthComparator = Comparator { str1: String,
                       str2: String -> str1.length - str2.length }
println(listOf("aaa", "bb", "c").sortedWith(lengthComparator))


Java
val numbers = listOf("one", "two", "three", "four")
val sortedNumbers = numbers.sortedBy { it.length }
println("Sorted by length ascending: $sortedNumbers")
val sortedByLast = numbers.sortedByDescending { it.last() }
println("Sorted by the last letter descending: $sortedByLast")


Java
val numbers = listOf("one", "two", "three", "four")
println("Sorted by length ascending: ${numbers.sortedWith(compareBy { it.length }


Java
val numbers = listOf("one", "two", "three", "four")
println(numbers.reversed())
val numbers = listOf("one", "two", "three", "four")
val reversedNumbers = numbers.asReversed()
println(reversedNumbers)


基本函数是sorted() 和 sortedDescending() 。它们以按升序和降序排序的对象集合的形式给出结果。这些可以应用于Comparable事件的集合

定制订购

它们允许您以任何您想要的类型订购实例。这对于定义通常不可比较的对象的顺序特别有用。
为了创建自定义订单,我们创建了一个包含compare()函数的Comparator 。它需要两个实例并比较它们,给出整数值作为输出。这个结果也与上述方法类似。

Java

val lengthComparator = Comparator { str1: String,
                       str2: String -> str1.length - str2.length }
println(listOf("aaa", "bb", "c").sortedWith(lengthComparator))

在这里,我们使用长度来比较而不是规定的字典顺序。
比较器也可以使用标准库中的compareBy()定义。该函数采用 lambda函数,该函数生成一个值,用于比较并将自定义顺序定义为生成值的自然顺序。
使用compareBy( ),

println(listOf("aaa", "bb", "c").sortedWith(compareBy { it.length }))

基本函数是sortedBy()sortedByDescending() 。它们使用定义的选择器函数将集合元素映射到Comparable值,并按值的自然顺序对集合进行排序。

Java

val numbers = listOf("one", "two", "three", "four")
val sortedNumbers = numbers.sortedBy { it.length }
println("Sorted by length ascending: $sortedNumbers")
val sortedByLast = numbers.sortedByDescending { it.last() }
println("Sorted by the last letter descending: $sortedByLast")

使用sortedWith() ,这可以写成:

Java

val numbers = listOf("one", "two", "three", "four")
println("Sorted by length ascending: ${numbers.sortedWith(compareBy { it.length }

随机顺序

该函数使用shuffled()以随机顺序提供包含集合元素的新列表。不需要参数或带有 Random 对象。

val numbers = listOf("one", "two", "three", "four")
println(numbers.shuffled())

相反的顺序

可以使用reversed()反转元素。它返回一个新集合,其中给出了原始集合的反向。原件不会改变,因为这个结果基本上是一个副本。另一个版本是asReversed() ,它提供反向视图而不是副本,因此是轻量级的。

Java

val numbers = listOf("one", "two", "three", "four")
println(numbers.reversed())
val numbers = listOf("one", "two", "three", "four")
val reversedNumbers = numbers.asReversed()
println(reversedNumbers)