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}
5 Réponses :
if (keyA == keyB && valueA != valueB) {
result[keyA] = "$valueA, $valueB"
} else {
result[keyA] = valueA
}
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}
}
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
}
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}
}
Le point est que le type de retour est mappe
@Ladamengh r.mapvalues {it.value.jointostring (",")} code> renvoie mappe
Vous pouvez implémenter et utilisez-le: p> Mergewith code> Fonction d'extension: val mapC = mapA mergeWith mapB
Vous trouverez peut-être plus facilement (ou au moins plus élégant) si vos valeurs de carte sont
Set CODE> 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 i> 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 () code>, lorsque vous les affichez / traitez-les.