在Kotlin中引用地图内的列表元素

时间:2018-04-08 03:45:48

标签: collections kotlin

我是Kotlin的新手,我仍在努力学习它。我一直在研究这个问题好几个小时,但仍然没有弄明白。我希望通过它的索引从列表内部获取一个元素。我想出了如何用一个简单的列表来做这个,就像这样

val my_list = listOf(1,2,3)
println(my_list.get(0))

以上是有效的,但是当我尝试使用存储在地图中的列表

val my_list = mutableMapOf<String, Any>()

my_list["set1"] = listOf(1,2,3)
my_list["set2"] = listOf("A","B","C")
my_list["set3"] = listOf("d","e","f")

val sub_list = my_list["set1"]

println(sub_list.get(0))

我收到以下错误

  

未解决的参考资料。以下候选人均不适用   因为接收器类型不匹配:@InlineOnly公共内联运算符   fun&lt; @OnlyInputTypes K,V&gt; Map.get(key:Int):???   在kotlin.collections中定义@SinceKotlin公共运营商的乐趣   MatchGroupCollection.get(name:String):MatchGroup?定义于   kotlin.text

注意:我主要使用Python,这就是我习惯的。我试图在Kotlin中重现的Python功能是有一个列表字典。

1 个答案:

答案 0 :(得分:1)

问题是地图的类型声明,它应该是:

val my_list = mutableMapOf<String, List<Any>>()

Any没有get()方法,因此无法调用它。

即使问题得到解决,你也可能不得不处理可空性问题,因为:

val sub_list = my_list["set1"]

将返回List<Any>?,这意味着my_list可能没有指定键的值。如果是这种情况,你将不得不做类似的事情:

sub_list?.get(0)?.run { println(it) }

反过来,如果sub_list为空,也会导致异常。这可以用更像是:

的东西来解决
vsub_list?.firstOrNull()?.run { println(it) }