kotlin 中的 sortBy - sortedBy 和 sortWith - sortedWith 有什么区别

Vik*_*rya 7 kotlin

我只是在探索 kotlin 集合,我观察到了一个重要的行为。


val sports = listOf<Sports>(
        Sports("cricket", "7"),
        Sports("gilli", "10"),
        Sports("lagori", "8"),
        Sports("goli", "6"),
        Sports("dabba", "4")
    )

    sports.sortedBy { it.rating } // sortedByDescending is to sort in descending
        .forEach({ println("${it.name} ${it.rating}") })


}

class Sports(name: String, rating: String) {
    var name: String = name
    var rating: String = rating
}

Run Code Online (Sandbox Code Playgroud)

上面我只能得到sortedBy方法,即以sorted. 我不知道为什么我没有得到sortBysortWith操作。

任何人都可以用简单的语言对此进行解释。

Vik*_*rya 7

好吧,这似乎是个愚蠢的问题。但是,有时即使是有经验的人也会为此苦苦挣扎。所以,我来回答这个

第一点,有两种列表类型。listOf,mutableListOf

所以,如果你需要 sortBy、sortWith 或任何以 sort 开头的东西,那么你必须使用 mutableListOf

  • sort 将应用于原始列表。但不返回任何东西。
  • sorted 不会更改原始列表,但在应用更改后返回新列表。

如果您想保持原始元素列表不变,请sorted选择sort内容或选择内容。

  • 这是 Kotlin stdlib 中的一般模式:“&lt;verb&gt;()”方法修改对象,而“&lt;verb&gt;ed()”方法则返回一个新对象。 (4认同)

Gas*_*lén 6

sortBy(仅对列表内的元素进行排序)-> 用于 MutableList

 /**
     * Sorts elements in the list in-place according to natural sort order of the value returned by specified [selector] function.
     * 
     * The sort is _stable_. It means that equal elements preserve their order relative to each other after sorting.
     */
    public inline fun <T, R : Comparable<R>> MutableList<T>.sortBy(crossinline selector: (T) -> R?): Unit {
        if (size > 1) sortWith(compareBy(selector))
    }
Run Code Online (Sandbox Code Playgroud)

sortedBy(返回一个新列表,其元素已排序)-> 用于列表

/**
 * 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 equal elements preserve their order relative to each other after sorting.
 */
public inline fun <T, R : Comparable<R>> Iterable<T>.sortedBy(crossinline selector: (T) -> R?): List<T> {
    return sortedWith(compareBy(selector))
}
Run Code Online (Sandbox Code Playgroud)