Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

560
Views
Combinar valores en el mapa kotlin

Necesito fusionar los mapas mapA y mapB con pares de "nombre" - "número de teléfono" en el mapa final, juntando los valores de las claves duplicadas, separados por comas. Los valores duplicados deben agregarse solo una vez. Necesito el enfoque más idiomático y correcto en términos de lenguaje.

Por ejemplo:

 val mapA = mapOf("Emergency" to "112", "Fire department" to "101", "Police" to "102") val mapB = mapOf("Emergency" to "911", "Police" to "102")

El resultado final debería verse así:

 {"Emergency" to "112, 911", "Fire department" to "101", "Police" to "102"}

Esta es mi función:

 fun mergePhoneBooks(mapA: Map<String, String>, mapB: Map<String, String>): Map<String, String> { val unionList: MutableMap <String, String> = mapA.toMutableMap() unionList.forEach { (key, value) -> TODO() } // here's I can't come on with a beatiful solution return unionList }
over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Qué tal si:

 val unionList = (mapA.asSequence() + mapB.asSequence()) .distinct() .groupBy({ it.key }, { it.value }) .mapValues { (_, values) -> values.joinToString(",") }

Resultado:

 {Emergency=112,911, Fire department=101, Police=102}

Esta voluntad:

  • producir una Sequence perezosa de los pares clave-valor de ambos mapas
  • agrúpelos por clave (resultado: Map<String, List<String> )
  • asigne sus valores a cadenas unidas por comas (resultado: Map<String, String> )
over 4 years ago · Santiago Trujillo Report

0

Puedes hacer lo siguiente:

 (mapA.keys + mapB.keys).associateWith { setOf(mapA[it], mapB[it]).filterNotNull().joinToString() }
  1. poner todas las llaves en un juego
  2. iterar sobre ese conjunto y asociar cada elemento con el conjunto de valores
  3. eliminar los valores nulos del conjunto de valores
  4. concatene los elementos en la lista de valores usando joinToString() .
over 4 years ago · Santiago Trujillo Report

0

Mientras miraba las otras soluciones, no podía creer que no haya una manera más fácil (o formas tan fáciles como la respuesta aceptada sin la necesidad de recrear un Map , nuevas listas intermedias, etc.). Aquí hay 3 (de muchas ;-)) soluciones que se me ocurrieron:

  1. Usando las claves y mapeando los valores más tarde:

     (mapA.keys.asSequence() + mapB.keys) .associateWith { sequenceOf(mapA[it], mapB[it]) // one of the sides may have null values in it (ie no entry in the map)... .filterNotNull() .distinct() .toList() // or if you require/prefer, do the following instead: joinToString() }
  2. Usando groupingBy y fold (o eche un vistazo a: Group by key y fold cada grupo simultáneamente (KEEP) ):

     (mapA.asSequence() + mapB.asSequence()) .groupingBy { it.key } .fold({ _, _ -> mutableSetOf() }) { _, accumulator, element -> accumulator.apply { add(element.value) } }

    También podría usar una String vacía en su lugar y concatenar en la operación de plegado de la manera que lo necesite. Mi primer enfoque solo usó una sequenceOf de en lugar de MutableSet . Depende de lo que necesites y de lo que quieras hacer con el resultado después. Asegúrese de utilizar la función de fold sobrecargada que acepta un selector de valor inicial, que crea un nuevo valor inicial cada vez que se encuentra una nueva clave. Gracias xzt por notarlo.

  3. Usando Javas Map.merge , pero ignorando los duplicados en el valor y también simplemente concatenando los valores:

     val mergedMap: Map<String, String> = mapA.toMutableMap().apply { mapB.forEach { key, value -> merge(key, value) { currentValue, addedValue -> "$currentValue, $addedValue" // just concatenate... no duplicates-check.. } } }

    Esto, por supuesto, también se puede escribir de manera diferente, pero de esta manera nos aseguramos de que mergedMap siga siendo solo Map<String, String> cuando se accede de nuevo.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Virtual assistant