【问题标题】:update MutableList inside Map更新 Map 中的 MutableList
【发布时间】:2020-06-30 20:25:30
【问题描述】:

我正在尝试在 Kotlin 中使用键/值对创建一个数据结构,其中键是整数,值是可变的整数列表。类似(伪代码):

1: 10, 20, 30
2: 50, 30, 25
3: 5
...

我不确定为此使用的最佳数据结构是什么,但我正在尝试使用地图来做到这一点:

var map = mutableMapOf<Int, MutableList<Int>>()

我对此有几个问题:

地图是否需要可变?键和值是动态的,但也会有一个与 MutableList 值匹配的 Int 键。

这是最适合做这种事情的数据结构吗?

我是否需要先检查该键是否存在,或者我是否可以开始在键上设置值,例如:

var id = 2
// assuming the map has already has [2]: 10, 3, this would mutate it to [2]: 10, 3, 5
map[id].add(5)

【问题讨论】:

  • 就像一个注释,除非你想在初始化之后重新分配map变量(即map = ...),它应该是val而不是var

标签: kotlin


【解决方案1】:

我不确定为此使用的最佳数据结构是什么,但我正在尝试使用地图来做到这一点:

var map = mutableMapOf<Int, MutableList<Int>>()

不错的选择。

地图需要可变吗?

是的,除非在地图的创建期间知道所有键(不一定是值 - 您可以使用空的 MutableLists 作为默认值)。

这是最适合做这种事情的数据结构吗?

这有点主观,但鉴于您提供的信息 - 是的 - 在我看来。

我是否需要先检查该键是否存在,或者我是否可以开始在键上设置值,例如:

var id = 2
// assuming the map has already has [2]: 10, 3, this would mutate it to [2]: 10, 3, 5
map[id].add(5)

如果id 已经存在于地图中,您可以使用map[id]!!.add(5)(注意!!,因为Maps 运算符[] 返回一个可选的(?))。您可以确保编译器存在(通过!!)或先使用?. 进行检查。


作为单独检查null 条目的替代方法,您可以使用getOrPut 方法:

map.getOrPut(id, ::mutableListOf).add(5)

感谢 @Tenfour04 的添加。

【讨论】:

  • 您可以使用map.getOrPut(id, ::mutableListOf).add(5) 避免单独检查预先存在的条目。
  • @Tenfour04 谢谢你,我完全忘记了这么方便的组合。将其添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2019-05-21
相关资源
最近更新 更多