代码之家  ›  专栏  ›  技术社区  ›  blubb

在Kotlin中是否有更惯用的方法来初始化此映射?

  •  5
  • blubb  · 技术社区  · 6 年前

    我正在写一个小游戏,其中的一部分就是跟踪玩家的得分。为此,我初始化了一个映射,如下所示:

    // given: players: List<Player>
    var scores: MutableMap<Player, Int> = mutableMapOf(*players.map { it to 0 }.toTypedArray())
    

    困扰我的是我需要使用 .toTypedArray() 关于 map { it to 0 } 在我应用扩展运算符之前 * 。有没有办法避免这种情况?通过压缩两个数组创建贴图时也会出现相同的问题:

    // does not compile:
    mapOf(*a1.zip(a2))
    
    // works but more verbose:
    mapOf(*a1.zip(a2).toTypedArray())
    
    2 回复  |  直到 6 年前
        1
  •  7
  •   JB Nizet    6 年前
    val pointsByPlayer = players.map { it to 0 }.toMap(mutableMapOf())
    

    也就是说,一个更好的设计可能只需要一个可变的 points Player类中的属性。

        2
  •  2
  •   s1m0nw1    6 年前

    这个 associate 功能还可以帮助解决您的问题,并且看起来更好:

    val scores: MutableMap<Player, Int> = players.associate { it to 0 }.toMutableMap()
    

    而且拉链更容易:

    val zipped = a1.zip(a2).toMap()