Sort using a custom comparator: Difference between revisions

Content added Content deleted
m (added category.)
Line 1,819: Line 1,819:
printArray("Sorted:", strings)
printArray("Sorted:", strings)
}</lang>
}</lang>

{{out}}
<pre>Unsorted: [Here, are, some, sample, strings, to, be, sorted]
Sorted: [strings, sample, sorted, Here, some, are, be, to]</pre>


A more idiomatic version (1.3):

<lang kotlin>fun main(args: Array<String>) {
val strings = listOf("Here", "are", "some", "sample", "strings", "to", "be", "sorted")
println("Unsorted: $strings")

// sort by content first then by length => no need for a custom comparator since sortedByDescending is stable
val sorted = strings.sorted().sortedByDescending { it.length }
println("Sorted: $sorted")
}</lang>


Using a custom comparator as requested by task description:

<lang kotlin>fun main(args: Array<String>) {
val strings = listOf("Here", "are", "some", "sample", "strings", "to", "be", "sorted")
println("Unsorted: $strings")

val sorted = strings.sortedWith (
kotlin.Comparator { a, b ->
compareValues(b.length, a.length).let {
if (it == 0) compareValues(a, b)
else it
}
})
println("Sorted: $sorted")
}</lang>


Faster when computing length only once per value ([[wp:Schwartzian transform|Schwartzian transform]]):

<lang kotlin>fun main(args: Array<String>) {
val strings = listOf("Here", "are", "some", "sample", "strings", "to", "be", "sorted")
println("Unsorted: $strings")

val sorted = strings.map { Pair(it, it.length) }.sortedWith (
kotlin.Comparator { a, b ->
compareValues(b.second, a.second).let {
if (it == 0) compareValues(a.first, b.first)
else it
}
}).map { it.first }
println("Sorted: $sorted")
}</lang>



{{out}}
{{out}}