Kotlin-在哈希图中存储和读取数组

时间:2019-05-17 22:07:29

标签: arrays kotlin hashmap

从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

有没有更快的方法来实现这一目标?

3 个答案:

答案 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是空安全的,因此如果对象是可空的,则必须使用以下空安全声明之一。

  1. ! ->这意味着即使object为null并且您仍然希望调用.count(),您都不会在意。

示例-myHashMap [“ dummy”] !!。count() 结果将是NullPointerException

  1. ? ->这意味着如果myHashMap [“ dummy”]返回null,则不想调用count()。

示例-myHashMap [“ dummy”] ?. count() 结果将为空