WedX - журнал о программировании и компьютерных науках

Kotlin - Хранение и чтение массива в hashmap

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

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

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

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

17.05.2019

Ответы:


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.

17.05.2019

2

Если вы хотите, чтобы 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 ("Привет" всем, "ABC" - 3)

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

18.05.2019

3

В приведенном здесь примере var testString = "__ $ {myHashMap [" test "]. Count ()} __"

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

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

println (myHashMap ["dummy"]) // Вывод - ноль

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

  1. !! -> Это означает, что вам все равно, даже если объект равен нулю, и вы все равно хотите, чтобы вызывалась .count ().

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

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

Пример - myHashMap ["пустышка"] ?. count () Результатом здесь будет null

18.05.2019
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]