Kotlin: строка в массиве в значение ключа - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь создать ключ => значение Hashmap.

Сначала у меня есть строка, ограниченная <br />.Затем я разделил его с помощью split () (чтобы получить каждую строку независимо).

Затем мне нужно разделить каждый результат с помощью "=" .Первая часть будет ключом (мне нужно, чтобы она была строкой), а вторая - значением (целое число)

Пока у меня есть

val formules = objInput.getString(Constants.formules)
val hashmap = HashMap<String, Int>()
val resSplit = formules.split("<br />")
    resSplit.forEach {
      val splitFormule = it.split(" = ")
      val key = splitFormule.elementAt(0)
      val value = splitFormule.elementAt(1)
      Log.i(TAG, "$key")
}

У меня есть этоошибка при попытке отобразить значение:

Индекс: 1, размер: 1

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Будьте осторожны, чтобы ваш ввод был верным.Пробелы актуальны.<br /> отличается от <br/>, а = отличается от <space>=<space>.Предполагая, что ваш ввод выглядит следующим образом:

foo = 3<br />bar = 5<br />baz = 9000

Затем вы можете создать карту с помощью этого простого выражения:

val map = formules
    .splitToSequence ("<br />") // returns sequence of strings: [foo = 3, bar = 5, baz = 9000]
    .map { it.split(" = ") } // returns list of lists: [[foo, 3 ], [bar, 5 ], [baz, 9000]]
    .map { it[0] to it[1] } // return list of pairs: [(foo, 3), (bar, 5), (baz, 9000)]
    .toMap() // creates a map from your pairs
0 голосов
/ 12 декабря 2018

Как вы уже сказали, вы забыли условие, чтобы проверить, содержит ли ваша строка =.

Некоторые дополнительные замечания: вы можете заменить elementAt также на get или на оператор индексации (например, splitFormule[0]).

Вас также может заинтересовать деструктурирование , например, ваш сплит также может быть записан следующим образом:

val (key, value) = it.split(" = ") // no need to extract the values from the array, if you know how the splitted data looks like
// you may even want to use the following if there could potentially be more than 1 '=' in the value part
val (key, value) = it.split(" = ", limit = 2) // at most 2 parts

Наконец, другой вариант, который пропускает ключи, если естьс ними не связаны никакие значения:

val yourMap = formules.splitToSequence("<br />")
    .filter { it.contains("=") }
    .map { it.split("""\s*=\s*""".toRegex(), limit = 2) }
    .map { (key, value) -> key to value } // destructuring
    .toMap()

// or: instead of filtering do a takeif and if you require those keys, do something appropriate there (e.g. set a default value instead)
val yourMap = formules.splitToSequence("<br />")
    .map { it.split("""\s*=\s*""".toRegex(), limit = 2) }
    .mapNotNull { it.takeIf { it.size == 2 } } // this discards now the entries without any value
    .map { (key, value) -> key to value } // destructuring
    .toMap()
...