从Noob到Kotlin。我有一个哈希图,它将保存其中一个键的数组。但是,当我读取该键的值时,Kotlin不会将其识别为数组。
我的哈希图:
var myHashMap = hashMapOf("test" to arrayOf<HashMap<String, Any>>())
读取数组:
var testString = "__ ${myHashMap["test"].count()} __"
当我尝试读取该值时,出现类型不匹配错误。我将数组以错误的方式存储在哈希图中吗?
我的哈希图是HashMap类型。我现在只是为值指定类型,稍后将动态存储实际值。
因此,稍后我阅读myHashMap [“ test”]时,会期待类似[[Hello]:“ World”,“ ABC”:3]
编辑:添加我的解决方案
我尝试了一下,现在可以了,但是检查是否有更好的解决方案。
var tests = task["test"] as ArrayList<HashMap<String, Any>>
var testCount = tests.count()
此外,如果我现在想继续向myHashMap [“ test”]中添加值,则将现有值存储到var中,将新值添加到var中,然后将其传递给myHashMap [“ test”]。
tests.add(someHashMap)
myHashMap["test"] = tests
有没有更快的方法来实现这一目标?
答案 0 :(得分:1)
按类型不匹配,您是指以下错误吗?
error: only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Array<kotlin.collections.HashMap<String, Any> /* = java.util.HashMap<String, Any> */>?
如果是这样,则应将表达式更改为"__${myHashMap["test"]?.count()}__"
或"__${myHashMap["test"]!!.count()}__"
,因为myHashMap["test"]
的值可以为null。
答案 1 :(得分:0)
如果您想让myHashMap["test"]
返回["Hello": "World", "ABC": 3]
,则此地图应为地图。输入方式可以是:
mapOf("test" to mapOf("Hello" to "World", "ABC" to 3))
这也可能是您的类型不匹配错误的原因。如上定义时,结果将是:
var testString = "__ ${myHashMap["test"]!!.count()} __" // -> 2
hashMapOf("test" to arrayOf<HashMap<String, Any>>())
的结果如下:
{
"test": [
{ "Hello": "World" },
{ "ABC": 3 }
]
}
mapOf("test" to mapOf("Hello" to "World", "ABC" to 3))
会导致如下所示:
{
"test": {
"Hello": "World",
"ABC": 3
}
}
作为背景:"Hello" to "World"
是地图的条目。您可以在mapOf
中添加多个,然后将它们串联成一个完整的may。您的代码看起来就像您将构建一个地图数组,每个地图只有一个条目。
更新您的更新:如果您想在地图中包含地图,也可以这样编写:
myHashMap [“ test”] = mapOf(“ Hello”到“ World”,“ ABC”到3)
如果以后要添加密钥,则还应该使用mutableMapOf
。否则myHashMap["newTests"] = ...
无效。
答案 2 :(得分:0)
在您提到的示例中, var testString =“ __ $ {myHashMap [” test“]。count()} __”
您收到错误消息,因为myHashMap [“ test”]可能为null,在这种情况下,.count()将引发NullPointerException。
示例-在这里,您创建了带有键“ test”的哈希表,并尝试访问该哈希表。尝试运行此-
println(myHashMap [“ dummy”])//输出-空
由于kotlin是空安全的,因此如果对象是可空的,则必须使用以下空安全声明之一。
示例-myHashMap [“ dummy”] !!。count() 结果将是NullPointerException
示例-myHashMap [“ dummy”] ?. count() 结果将为空