0. 寫在前邊
最近在工作間隙,試了一把Kotlin油讯。一發(fā)車就根本停不下來,各種語法糖延欠,各種炫酷的寫法…
閑話少敘陌兑,分享一下學(xué)習(xí)中遇到的集合排序問題
1. 先構(gòu)造一個業(yè)務(wù)類Person 及 Person集合
//定義一個Person類,有name 和 age 兩屬性
data class Person(var name: String, var age: Int)
var personList: MutableList<Person> = mutableListOf()
personList.add(Person("Jim", 12))
personList.add(Person("A-Lin", 12))
personList.add(Person("Tom", 11))
personList.add(Person("Mary", 14))
2. 使用 sortBy 排序
fun main(args: Array<String>) {
//構(gòu)造personlist... println("----排序前----")
personList.forEach(::println) println("----排序后----")
//按年齡排序
personList.sortBy ({ it.age })
//或者寫成 //personList.sortBy(Person::age)
personList.forEach(::println)
}
運行結(jié)果如下:
----排序前----
Person(name=Jim, age=12)
Person(name=A-Lin, age=12)
Person(name=Tom, age=11)
Person(name=Mary, age=14)
----排序后----
Person(name=Tom, age=11)
Person(name=Jim, age=12)
Person(name=A-Lin, age=12)
Person(name=Mary, age=14)
sortBy 為正序排列由捎,跟其對應(yīng)的降序方法為 sortByDescending
personList.sortByDescending({ it.age })
//運行的結(jié)果為
----排序后----
Person(name=Mary, age=14)
Person(name=Jim, age=12)
Person(name=A-Lin, age=12)
Person(name=Tom, age=11)
3. 使用 sortWith 排序
實際情況下兔综,我們的業(yè)務(wù)需求往往需要根據(jù)多個條件來排序,這時我們就需要用到 sortWith 方法
//先根據(jù)age 升序排列狞玛,若age相同邻奠,根據(jù)name升序排列
personList.sortWith(compareBy({ it.age }, { it.name }))
// 運行結(jié)果如下:
----排序后----
Person(name=Tom, age=11)
Person(name=A-Lin, age=12)
Person(name=Jim, age=12)
Person(name=Mary, age=14)
sortWith 方法中,傳入的 compareBy({屬性1},{屬性2},…)參數(shù)为居, compareBy() 這里的參數(shù)個數(shù)是可變的碌宴,但是都是默認的升序排列。所以我們還可以根據(jù)自己的實際需求蒙畴,給sortWith傳入一個Comparator對象贰镣,來達到一個更高級更復(fù)雜的邏輯
//構(gòu)造一個Comparator對象,完成排序邏輯:先按age降序排列膳凝,若age相同碑隆,則按name升序排列
val c1: Comparator<Person> = Comparator { o1, o2 ->
if (o2.age == o1.age) {
o1.name.compareTo(o2.name)
} else {
o2.age - o1.age
}
}
personList.sortWith(c1)
// 運行結(jié)果如下:
----排序后----
Person(name=Mary, age=14)
Person(name=A-Lin, age=12)
Person(name=Jim, age=12)
Person(name=Tom, age=11)
4. 通過 data class 實現(xiàn) Comparable 接口來排序
重新構(gòu)造 Person 類
data class Person(var name: String, var age: Int) : Comparable<Person> {
override fun compareTo(other: Person): Int {
if (this.age == other.age) {
return this.name.compareTo(other.name)
} else {
return other.age - this.age
}
}
}
調(diào)用 list.sorted()方法排序
//sorted 方法返回排序好的list
val sorted = personList.sorted()
sorted.forEach(::println)
//運行結(jié)果如下:
----排序后----
Person(name=Mary, age=14)
Person(name=A-Lin, age=12)
Person(name=Jim, age=12)
Person(name=Tom, age=11)