微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Kotlin 重新排序 LinkedHashMap 键的问题

如何解决Kotlin 重新排序 LinkedHashMap 键的问题

我的目标是按照 LinkedHashMap 中 Map 中存储的顺序从 Kotlin获取键。我在 Java 有这项工作,但 Kotlin 的做法不同。

我有一个包含 2 个子类的基类。一个子类将映射设置为 LinkedHashMap,另一个子类设置为 TreeMap。有序子类和无序子类都在超类中拥有它们的所有功能。基类在 Java 中使用 Map,在 Kotlin 中使用 MutableMap,因为我需要经常改变映射。如果我使用 MutableMap 作为基础,我如何在 Kotlin 中按顺序从 LinkedHashMap 获取密钥?我可以看到它们在使用调试器时是有序的。

我使用的是带有 2 个子类的密封基类,元素是否按顺序排序是子类之间的区别。

这是工作的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://stackoverflow.com/help/minimal-reproducible-example

旁注:在 Kotlin 中,编写 map.keys.toListmap.keys.toMutableList 而不是直接使用 ArrayList 构造函数更为惯用,除非您真的特别需要 ArrayList。>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。