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.toListmap.keys.toMutableList 比直接使用 ArrayList 构造函数更为惯用,除非您确实特别需要 ArrayList