1

尝试研究 Kotlin 中的集合转换,我对associateWith转换扩展功能的文档感到有些困惑。

它说:

基本关联函数 associateWith() 创建了一个 Map,其中原始集合的元素是键,而值是由给定的转换函数从它们产生的。如果两个元素相等,则只有最后一个元素保留在 map 中

然而,当我使用包含重复元素的列表(即它们相等)来测试这个函数时,最后一个被排除在 map 之外,只有第一个是剩下的,这与文档中所说的相反。

fun main() {
val numbers = listOf("one", "two", "three", "four", "five", "four")
val mapOfNumbers = numbers.associateWith { it.length }
println(mapOfNumbers) //the first "four" element is the one that remains in the map
}

在 Kotlin Playground 中运行它会打印以下内容

{一=3,二=3,三=5,四=4,五=4}

文档中的措辞是否存在,或者我的思路是否遗漏了一些东西?

4

1 回答 1

3

最后一个被排除在地图之外,只有第一个是剩下的

你没有观察你认为你在这里的东西。您正在查看地图内容的字符串表示形式。一般来说,地图是无序的,因此查看顺序在这里没有帮助。默认情况下, KotlinLinkedHashMap在此类 stdlib 函数中创建 s ,因此它保留了插入顺序。即使第二个"four"覆盖第一个,它仍然会被放置在那个位置。

文档的意思是,如果有重复项,并且如果您的转换 lambda 为重复键提供不同的值,则最后一个获胜。在这里,您的 lambda 为相同的键提供相同的值,因此您无法使用当前代码测试文档的这一部分。

这是一个测试文档内容的示例:

val numbers = listOf("one", "two", "three", "four", "five", "four")

var order = 1
val mapOfNumbers = numbers.associateWith { order++ }
println(mapOfNumbers) // {one=1, two=2, three=3, four=6, five=5}
于 2022-01-11T11:32:53.730 回答