Dictionary 科特林地图<;字符串,列表<;对象>&燃气轮机;值在toSortedMap调用后更改
我有这样一张地图Dictionary 科特林地图<;字符串,列表<;对象>&燃气轮机;值在toSortedMap调用后更改,dictionary,kotlin,Dictionary,Kotlin,我有这样一张地图 Map<String, List<Object>> 通过键比较值,我得到了已排序的贴图,但每个值列表中的对象数量也发生了变化(减少)。太奇怪了。在hood-toSortedMap方法下,使用给定的比较器创建TreeMap,我不知道TreeMap的内部结构,但我假设任何映射都不应该更改值,而只应该使用键进行操作。这对TreeMap来说是正常的还是Kotlin库中的一个bug 编辑 代码我得到这个问题的原因是: val categoriesKeys =
Map<String, List<Object>>
通过键比较值,我得到了已排序的贴图,但每个值列表中的对象数量也发生了变化(减少)。太奇怪了。在hood-toSortedMap方法下,使用给定的比较器创建TreeMap,我不知道TreeMap的内部结构,但我假设任何映射都不应该更改值,而只应该使用键进行操作。这对TreeMap来说是正常的还是Kotlin库中的一个bug
编辑
代码我得到这个问题的原因是:
val categoriesKeys = listOf("key1", "key2", etc)
val categoriesKeysOrdersMap = mapOf("key1" to 0, "key2" to 1, etc)
val model = listOf(MyModel(..), MyModel(..), etc)
val categoryKeyToModelsMap = categoriesKeys
.asSequence()
.map { key ->
key to model.filter {
it.categories?.contains(key) == true
}
}
.filter { it.second.isNotEmpty() }
.toMap()
.toSortedMap(compareBy { categoriesKeysOrdersMap[it] })
在toMap步骤中,我得到了想要的地图,但没有排序,但在toSortedMap之后,我的数据被弄乱了。Comparator使用category中的键通过category中的int值KeyOrdersMap进行比较。请提供一些代码来重现此问题显示您的Comparator。比如:
请注意,如果键的自然排序顺序认为此映射的任意两个键相等(如果根据Comparable.compareTo的键相等与根据any.equals的键相等不一致,则可能发生这种情况),只有与最后一个关联的值才能进入结果映射。
@gpunto我添加了代码。我们需要可以编译和运行的代码来查看实际问题。您提供的代码无法编译和运行,因为它缺少信息,例如MyModel
类以及model
列表的生成方式。通过只查看您发布的代码,您正在试验的问题不应该发生。请提供一些复制此问题的代码显示您的比较器。比如:请注意,如果键的自然排序顺序认为此映射的任意两个键相等(如果根据Comparable.compareTo的键相等与根据any.equals的键相等不一致,则可能发生这种情况),只有与最后一个关联的值才能进入结果映射。
@gpunto我添加了代码。我们需要可以编译和运行的代码来查看实际问题。您提供的代码无法编译和运行,因为它缺少信息,例如MyModel
类以及model
列表的生成方式。通过只查看您发布的代码,您正在试验的问题不应该发生。
val categoriesKeys = listOf("key1", "key2", etc)
val categoriesKeysOrdersMap = mapOf("key1" to 0, "key2" to 1, etc)
val model = listOf(MyModel(..), MyModel(..), etc)
val categoryKeyToModelsMap = categoriesKeys
.asSequence()
.map { key ->
key to model.filter {
it.categories?.contains(key) == true
}
}
.filter { it.second.isNotEmpty() }
.toMap()
.toSortedMap(compareBy { categoriesKeysOrdersMap[it] })