Kotlin - Хранение и чтение массива в hashmap - PullRequest
0 голосов
/ 18 мая 2019

нуб к котлину. У меня есть хэш-карта и который будет содержать массив для одного из его ключей. Однако когда я читаю значение для этого ключа, Котлин не распознает его как массив.

Моя хэш-карта:

var myHashMap = hashMapOf("test" to arrayOf<HashMap<String, Any>>())

Чтение массива:

var testString = "__ ${myHashMap["test"].count()} __"

Я получаю ошибку несоответствия типов при попытке прочитать значение. Я неправильно храню массив в hashmap?

Мой хэш-файл относится к типу HashMap. Я просто указываю тип для значения сейчас и буду хранить фактические значения динамически позже.

Поэтому позже, когда я прочитаю myHashMap ["test"], я ожидал что-то вроде ["Hello": "World", "ABC": 3]

Редактировать: добавление моего решения

Я попробовал это, и пока это работает, но проверяя, есть ли лучшее решение.

    var tests = task["test"] as ArrayList<HashMap<String, Any>>
    var testCount = tests.count()

Также, если я хочу продолжать добавлять значения в myHashMap ["test"], сейчас я сохраняю существующие значения в var, добавляю новые в него и затем передаю его в myHashMap ["test"].

tests.add(someHashMap)
myHashMap["test"] = tests

Есть ли более быстрый способ добиться этого?

Ответы [ 3 ]

1 голос
/ 18 мая 2019

По несоответствию типов вы ссылаетесь на следующую ошибку?

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"]можно оценить до нуля.

0 голосов
/ 18 мая 2019

В примере, который вы упомянули здесь, var testString = "__ $ {myHashMap [" test "]. Count ()} __"

Вы получаете ошибку, потому что myHashMap ["test "] может быть нулевым, и в этом случае .count () выдаст исключение NullPointerException.

Пример. Здесь вы создали хэш-карту с ключом «test» и попытались получить к нему доступ.Попробуйте запустить это -

println (myHashMap ["dummy"]) // Вывод - null

Поскольку kotlin безопасен с нулевым значением, если объект допускает обнуление, необходимо выполнить одно из следующих действийнулевые безопасные утверждения.

  1. !!-> Это означает, что вам все равно, даже если object имеет значение null, и вы все еще хотите, чтобы .count () вызывался.

Пример - myHashMap ["dummy"] !!. Count () Результатом здесь будет NullPointerException

?-> Это означает, что не нужно вызывать count (), если в случае, если myHashMap ["dummy"] возвращает ноль.

Пример - myHashMap ["dummy"] ?. count () Результат здесь будетнуль

0 голосов
/ 18 мая 2019

Если вы хотите, чтобы 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, которые затем объединяются до полного мая.Ваш код будет выглядеть так, как если бы вы создали массив карт, каждая из которых имеет только одну запись.

ЗАПИШИТЕ свое обновление: если вы хотите иметь карту на карте, вы также можете написать ее так:

myHashMap ["test"] = mapOf (от "Hello" до "World", от "ABC" до 3)

Если вы хотите добавить ключи позже, вам также следует использовать mutableMapOf вместо.В противном случае myHashMap["newTests"] = ... не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...