Карта на другую карту. Для большого кода. Есть более простое решение? - PullRequest
0 голосов
/ 29 февраля 2020

Android Studio 3.6

Преобразование одной карты в другую: мне нужно заменить в имени ключа все символы "_" на пробел.

Вот фрагмент десериализатора:

import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import com.google.gson.JsonDeserializationContext
import com.google.gson.JsonDeserializer
import com.google.gson.JsonElement
import com.google.gson.JsonParseException

val pricesNode: JsonNode = objectMapper.readTree(pricesJson.toString())
        val fields: MutableIterator<MutableMap.MutableEntry<String, JsonNode>>? =
            pricesNode.fields()
        val prices = HashMap<String, Double>()
        fields?.forEach {
            val fuelType = it.key.replace("_", " ")
            prices.put(fuelType, it.value.asDouble())
        }

но я думаю, что это слишком много кода. Есть более простое решение?

Ответы [ 4 ]

0 голосов
/ 29 февраля 2020

Предполагаемый способ - использовать mapKeys:

fields
   .mapKeys { it.key.replace("_", " ") }

Но так как похоже, что вы отображаете и ключи, и значения, вы можете сделать:

fields.entries
    .associate { (k, v)-> k.replace("_", " ") to v.toDouble()}
0 голосов
/ 29 февраля 2020

Как насчет чего-то подобного?

val prices = objectMapper
  .readTree(json)
  .fields()
  ?.asSequence() // 1
  ?.map { it.key.replace("_", " ") to it.value.asDouble() }
  ?.toMap() ?: hashMapOf() // 2

, если вы будете использовать asSequence (1), позже вы сможете использовать карту для преобразования объекта так, как вы хотите.

Так как вы бы как избавиться от нуля в конце и просто иметь Map<String,Double> в конце, вы можете использовать ?: hashMapOf() в конце (2), чтобы вы «преобразовали» ноль в пустую карту

0 голосов
/ 29 февраля 2020

Я нашел решение:

 val pricesJson = root["prices"].asJsonObject
        val pricesNode: JsonNode = objectMapper.readTree(pricesJson.toString())
        var pricesMap =
            objectMapper.convertValue<Map<String, Double>>(
                pricesNode,
                object :
                    TypeReference<Map<String?, Double?>?>() {})
        pricesMap = pricesMap.map { it.key.replace("_", " ") to it.value }.toMap()

или как это:

val pricesNode: JsonNode = objectMapper.readTree(pricesJson.toString())
        val fields: MutableIterator<MutableMap.MutableEntry<String, JsonNode>>? =
            pricesNode.fields()
        val pricesMap: Map<String, Double> =
            fields?.asSequence()?.associate { (k, v) -> k.replace("_", " ") to v.asDouble() }!!
0 голосов
/ 29 февраля 2020

покажи код

val map= mutableMapOf<String,String>()
        val newMap = map.mapKeys {
            it.key.replace("_", "")
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...