0
votes

Comment fusionner deux cartes correctement?

J'ai essayé de résoudre un problème, où je devrais fusionner deux cartes pour obtenir le nouveau sans valeurs égales pour les touches égales.

{Emergency=112, Police=02}


1 commentaires

Vous trouverez peut-être plus facilement (ou au moins plus élégant) si vos valeurs de carte sont Set S, avec chaque numéro sous forme de chaîne distincte, au lieu de les stocker en tant que chaînes combinées séparées par des virgules. C'est susceptible de rendre la tâche beaucoup plus facile de gérer des cas tels que lorsque la deuxième carte a une valeur qui partage certains des mêmes numéros que le premier - surtout si elles sont commandées différemment. Vous pouvez ensuite les concaténer à une seule chaîne (dans n'importe quel ordre que vous préférez), par ex. Utilisation de jointostring () , lorsque vous les affichez / traitez-les.


5 Réponses :


0
votes
if (keyA == keyB && valueA != valueB) {
    result[keyA] = "$valueA, $valueB"
} else {
    result[keyA] = valueA
}

0 commentaires

0
votes

Je pense que ci-dessous le code résoudra votre problème:

fun main() {
    val first = mapOf("A" to "0", "B" to "1", "C" to "2")
    val second = mapOf("A" to "4", "C" to "2")

    val result = (first.asSequence() + second.asSequence()).distinct()
                    .groupBy({ it.key }, { it.value })
                    .mapValues { it.value.joinToString(",") }

    print(result)           // {A=0,4, B=1, C=2}
}


0 commentaires

0
votes

Une carte ne peut avoir qu'une seule valeur par clé. Si vous avez besoin de préserver plusieurs valeurs, vous devez modifier le type de valeur en quelque chose comme une liste ou une paire.

fun <K, V> mergeMapsValues(mapA: Map<K, V>, mapB: Map<K, V>): Map<K, List<V>> {
    val outMap = mapA.mapValues { (_, value) -> mutableListOf(value) }.toMutableMap()
    mapB.forEach { (key, value) ->
        outMap.getOrPut(key, ::mutableListOf).add(value)
    }
    return outMap
}


0 commentaires

4
votes
fun main() {
    val m1 = mapOf("Emergency" to "112")
    val m2 = mapOf("Emergency" to "911", "Police" to "02")
    val r = (m1.entries + m2.entries).groupBy({ it.key }, { it.value })
    // or use Sequence 
    // val r = (m1.asSequence() + m2.asSequence()).distinct().groupBy({ it.key }, { it.value })
    println(r) // {Emergency=[112, 911], Police=[02]}
    println(r.mapValues { it.value.joinToString(", ") }) // {Emergency=112, 911, Police=02}
}

2 commentaires

Le point est que le type de retour est mappe , pas mapper >, donc c'est une bonne solution, mais pas pour ce problème concret


@Ladamengh r.mapvalues ​​{it.value.jointostring (",")} renvoie mappe



0
votes

Vous pouvez implémenter Mergewith code> Fonction d'extension: xxx pré>

et utilisez-le: p>

val mapC = mapA mergeWith mapB


0 commentaires