sortedBy
inline fun <T, R : Comparable<R>> Array<out T>.sortedBy(crossinline selector: (T) -> R?): List<T>(source)
inline fun <T, R : Comparable<R>> Iterable<T>.sortedBy(crossinline selector: (T) -> R?): List<T>(source)
Returns a list of all elements sorted according to natural sort order of the value returned by specified selector function.
The sort is stable. It means that elements for which selector returned equal values preserve their order relative to each other after sorting.
Since Kotlin
1.0Samples
import kotlin.math.*
import kotlin.test.*
fun main() {
//sampleStart
class Dish(val name: String, val calories: Int, val tasteRate: Float) {
override fun toString(): String = "Dish($name: $calories cal, taste $tasteRate/5)"
}
val fridgeContent = listOf(Dish("π¨", 207, 4.7f), Dish("π₯¦", 34, 2.3f), Dish("π§", 34, 4.9f))
val dullDishes = fridgeContent.sortedBy { it.tasteRate }
println(dullDishes) // [Dish(π₯¦: 34 cal, taste 2.3/5), Dish(π¨: 207 cal, taste 4.7/5), Dish(π§: 34 cal, taste 4.9/5)]
val lightDishes = fridgeContent.sortedBy { it.calories }
// note that the sorting is stable, so the π₯¦ is before the π§
println(lightDishes) // [Dish(π₯¦: 34 cal, taste 2.3/5), Dish(π§: 34 cal, taste 4.9/5), Dish(π¨: 207 cal, taste 4.7/5)]
// the original collection remains unchanged
println(fridgeContent) // [Dish(π¨: 207 cal, taste 4.7/5), Dish(π₯¦: 34 cal, taste 2.3/5), Dish(π§: 34 cal, taste 4.9/5)]
//sampleEnd
}
inline fun <R : Comparable<R>> ByteArray.sortedBy(crossinline selector: (Byte) -> R?): List<Byte>(source)
inline fun <R : Comparable<R>> ShortArray.sortedBy(crossinline selector: (Short) -> R?): List<Short>(source)
inline fun <R : Comparable<R>> IntArray.sortedBy(crossinline selector: (Int) -> R?): List<Int>(source)
inline fun <R : Comparable<R>> LongArray.sortedBy(crossinline selector: (Long) -> R?): List<Long>(source)
inline fun <R : Comparable<R>> FloatArray.sortedBy(crossinline selector: (Float) -> R?): List<Float>(source)
inline fun <R : Comparable<R>> DoubleArray.sortedBy(crossinline selector: (Double) -> R?): List<Double>(source)
inline fun <R : Comparable<R>> BooleanArray.sortedBy(crossinline selector: (Boolean) -> R?): List<Boolean>(source)
inline fun <R : Comparable<R>> CharArray.sortedBy(crossinline selector: (Char) -> R?): List<Char>(source)
Returns a list of all elements sorted according to natural sort order of the value returned by specified selector function.
The sort is stable. It means that elements for which selector returned equal values preserve their order relative to each other after sorting.
Since Kotlin
1.0Samples
import kotlin.math.*
import kotlin.test.*
fun main() {
//sampleStart
val unsorted = intArrayOf(3, 1, 2, 4)
val sortedByRemainder = unsorted.sortedBy { it % 3 }
// the sorting is stable: the order of 1 (1 % 3 == 1) and 4 (4 % 3 == 1) was preserved
println(sortedByRemainder) // [3, 1, 4, 2]
val mapping = mapOf(1 to "one", 2 to "two", 3 to "three", 4 to "four")
val sortedByPronunciation = unsorted.sortedBy {
// take a key to sort by from the mapping
mapping.getOrDefault(it, "unknown")
}
// four < one < three < two, lexicographically
println(sortedByPronunciation) // [4, 1, 3, 2]
// the original array remains unchanged
println(unsorted.toList()) // [3, 1, 2, 4]
//sampleEnd
}