Kotlin 重新排序 LinkedHashMap 键的问题
Problem with Kotlin reordering LinkedHashMap keys
我的目标是按照 Kotlin
中 Map 中存储的顺序从 LinkedHashMap
中获取键。我在 Java
中工作,但 Kotlin
的做法不同。
我有一个带 2 个子class 的基础 class。一个 subclass 将地图设置为 LinkedHashMap
,另一个设置为 TreeMap
。有序和无序的 subclasses 都在 superclass 中具有它们的所有功能。基础 class 在 Java 中使用 Map
,在 Kotlin
中使用 MutableMap,因为我需要经常改变地图。如果我使用 LinkedHashMap
作为基础,我如何从 MutableMap
中按顺序在 Kotlin
中获取密钥?我可以看到它们在使用调试器时是有序的。
我用的是sealed base class和2个subclasses,元素是否按顺序排序是subclasses之间的区别。
这是有效的 Java 代码:
protected Map<T, Double> map;
if (comparable) {
this.map = new TreeMap<>();
} else {
this.map = new LinkedHashMap<>();
}
public List<T> getKeys() {
return new ArrayList<>(this.map.keySet());
}
和损坏的 Kotlin 代码:
protected var map: MutableMap<T, Double>
map = if (comparable) TreeMap() else LinkedHashMap()
val getKeys = ArrayList(map.keys)
我尝试使用迭代器,但迭代器没有重置!
NoSuchElement 什么时候应该有?
var keys = map.iterator
assert(keys.next().key == 0)
assert(keys.next().key == 1)
assert(keys.next().key == 2)
pf.swapPositions(2, 1)
keys = map.iterator
assert(keys.next().key == 0)
assert(keys.next().key == 2)
assert(keys.next().key == 1)
val iterator = map.iterator()
我能看到的唯一区别是 val getKeys
根本不等同于 Java 的 public List<T> getKeys()
;那将是
fun getKeys() = ArrayList(map.keys)
或
val keys get() = ArrayList(map.keys)
您编写的代码只评估 ArrayList(map.keys)
一次,在构造期间,地图可能为空时。
这可能不是唯一的问题;如果修复后还是不行,请看https://whosebug.com/help/minimal-reproducible-example.
旁注:在 Kotlin 中,编写 map.keys.toList
或 map.keys.toMutableList
比直接使用 ArrayList
构造函数更为惯用,除非您确实特别需要 ArrayList
。
我的目标是按照 Kotlin
中 Map 中存储的顺序从 LinkedHashMap
中获取键。我在 Java
中工作,但 Kotlin
的做法不同。
我有一个带 2 个子class 的基础 class。一个 subclass 将地图设置为 LinkedHashMap
,另一个设置为 TreeMap
。有序和无序的 subclasses 都在 superclass 中具有它们的所有功能。基础 class 在 Java 中使用 Map
,在 Kotlin
中使用 MutableMap,因为我需要经常改变地图。如果我使用 LinkedHashMap
作为基础,我如何从 MutableMap
中按顺序在 Kotlin
中获取密钥?我可以看到它们在使用调试器时是有序的。
我用的是sealed base class和2个subclasses,元素是否按顺序排序是subclasses之间的区别。
这是有效的 Java 代码:
protected Map<T, Double> map;
if (comparable) {
this.map = new TreeMap<>();
} else {
this.map = new LinkedHashMap<>();
}
public List<T> getKeys() {
return new ArrayList<>(this.map.keySet());
}
和损坏的 Kotlin 代码:
protected var map: MutableMap<T, Double>
map = if (comparable) TreeMap() else LinkedHashMap()
val getKeys = ArrayList(map.keys)
我尝试使用迭代器,但迭代器没有重置! NoSuchElement 什么时候应该有?
var keys = map.iterator
assert(keys.next().key == 0)
assert(keys.next().key == 1)
assert(keys.next().key == 2)
pf.swapPositions(2, 1)
keys = map.iterator
assert(keys.next().key == 0)
assert(keys.next().key == 2)
assert(keys.next().key == 1)
val iterator = map.iterator()
我能看到的唯一区别是 val getKeys
根本不等同于 Java 的 public List<T> getKeys()
;那将是
fun getKeys() = ArrayList(map.keys)
或
val keys get() = ArrayList(map.keys)
您编写的代码只评估 ArrayList(map.keys)
一次,在构造期间,地图可能为空时。
这可能不是唯一的问题;如果修复后还是不行,请看https://whosebug.com/help/minimal-reproducible-example.
旁注:在 Kotlin 中,编写 map.keys.toList
或 map.keys.toMutableList
比直接使用 ArrayList
构造函数更为惯用,除非您确实特别需要 ArrayList
。