当前位置: 代码迷 >> 综合 >> kotlin 排序:sort / Comparator / Comparable
  详细解决方案

kotlin 排序:sort / Comparator / Comparable

热度:96   发布时间:2024-01-24 20:46:36.0

示例一:

//==============================sort===================================@Testfun test1() {val intArray = mutableListOf(1, 2, 6, 3, 7, 9, 4)//使用元素的自然顺序:升序intArray.sort()println(intArray) // [1, 2, 3, 4, 6, 7, 9]}//对于降序,我们可以使用sortByDescending或reverse方法。@Testfun test2() {val intArray = mutableListOf(1, 2, 6, 3, 7, 9, 4)intArray.sort()//反转intArray.reverse()println(intArray)//[9, 7, 6, 4, 3, 2, 1]}@Testfun test3() {val intArray = mutableListOf(1, 2, 6, 3, 7, 9, 4)//倒序intArray.sortDescending()println(intArray)//[9, 7, 6, 4, 3, 2, 1]}//==============================sortBy===================================// 该sortBy方法允许我们通过一个选择器功能作为参数。// 选择器函数将接收对象,并应返回我们要排序的值:@Testfun test4() {val mapList = mutableListOf(1 to "A", 2 to "B", 5 to "C", 3 to "D")mapList.sortBy { it.first }println(mapList) // [(1, A), (2, B), (3, D), (5, C)]mapList.sortBy { it.second }println(mapList) // [(1, A), (2, B), (5, C), (3, D)]}//==============================sortWith===================================//传递一个  Comparator对象作为参数@Testfun test5() {val sortedValues = mutableListOf(1 to "a",2 to "b",7 to "c",6 to "d",5 to "c",6 to "e")sortedValues.sortWith(compareBy({ it.second }, { it.first }))println(sortedValues) // [(1, a), (2, b), (5, c), (7, c), (6, d), (6, e)]}

示例二:

参考:Kotlin 集合排序


import org.junit.Test
import java.util.*
import kotlin.Comparatordata class Person(var name: String, var age: Int)private val personList: MutableList<Person> = mutableListOf(Person("B", 2),Person("A", 2),Person("D", 1),Person("C", 3)
)data class School(var name: String, var age: Int) : Comparable<School> {override fun compareTo(other: School): Int {return if (this.age == other.age) {this.name.compareTo(other.name)} else {other.age - this.age}}
}//Comparable 与 Comparator :
// 两者的区别是实现Comparator接口代码更加灵活,可以定义某个类的多个比较器,
// 从而在排序时根据实际场景自由调用,而Comparable接口实现后便不能改动class MyComparator : Comparator<School> {override fun compare(p1: School, p2: School): Int {return if (p1.age == p2.age) {p1.name.compareTo(p2.name)} else {p2.age - p1.age}}
}private val schoolList: MutableList<School> = mutableListOf(School("B", 2),School("A", 2),School("D", 1),School("C", 3)
)class TestC {//=================================sortBy=============================// sortBy 为正序排列,跟其对应的降序方法为 sortByDescending@Testfun test1() {println("前================================$personList")personList.sortBy { it.name }    //升序println("后================================$personList")}//前================================// [Person(name=B, age=2), Person(name=A, age=2), Person(name=D, age=1), Person(name=C, age=3)]//后================================// [Person(name=A, age=2), Person(name=B, age=2), Person(name=C, age=3), Person(name=D, age=1)]//=================================sortByDescending=============================@Testfun test2() {println("前================================$personList")personList.sortByDescending { it.age }  //降序println("后================================$personList")}//前================================// [Person(name=B, age=2), Person(name=A, age=2), Person(name=D, age=1), Person(name=C, age=3)]//后================================// [Person(name=C, age=3), Person(name=B, age=2), Person(name=A, age=2), Person(name=D, age=1)]//=================================sortWith 1===============================//实际情况下,我们的业务需求往往需要根据多个条件来排序,这时我们就需要用到 sortWith 方法//sortWith 方法中,传入的 compareBy({属性1},{属性2},…)参数, compareBy() 这里的参数个数是可变的,// 但是都是默认的升序排列。所以我们还可以根据自己的实际需求,// 给sortWith传入一个Comparator对象,来达到一个更高级更复杂的逻辑@Testfun test3() {println("前================================$personList")//先根据age 【升序】排列,若age相同,根据name【升序】排列personList.sortWith(compareBy({ it.age }, { it.name }))println("后================================$personList")}//前================================// [Person(name=B, age=2), Person(name=A, age=2), Person(name=D, age=1), Person(name=C, age=3)]//后================================// [Person(name=D, age=1), Person(name=A, age=2), Person(name=B, age=2), Person(name=C, age=3)]//=================================sortWith 2==============================@Testfun test4() {println("前================================$personList")personList.sortWith(//构造一个Comparator对象,完成排序逻辑:// 先按age【降序】排列,若age相同,则按name【升序】排列Comparator { o1, o2 ->//o1,o2顺序,左边大自然排序升序,否则降序if (o2.age == o1.age) {o1.name.compareTo(o2.name)} else {o2.age - o1.age}})println("后================================$personList")}//前================================// [Person(name=B, age=2), Person(name=A, age=2), Person(name=D, age=1), Person(name=C, age=3)]//后================================// [Person(name=C, age=3), Person(name=A, age=2), Person(name=B, age=2), Person(name=D, age=1)]//================================= Comparable 接口和 sorted==============================@Testfun test5() {println("前================================$schoolList")//sorted()有返回值val sortedList = schoolList.sorted()println("后================================$sortedList")}//前================================// [School(name=B, age=2), School(name=A, age=2), School(name=D, age=1), School(name=C, age=3)]//后================================// [School(name=C, age=3), School(name=A, age=2), School(name=B, age=2), School(name=D, age=1)]//============================= Comparator 接口和 Collections.sort ============================@Testfun test6() {println("前================================$schoolList")Collections.sort(schoolList, MyComparator())println("后================================$schoolList")}//前================================// [School(name=B, age=2), School(name=A, age=2), School(name=D, age=1), School(name=C, age=3)]//后================================// [School(name=C, age=3), School(name=A, age=2), School(name=B, age=2), School(name=D, age=1)]}
  相关解决方案