Digamos que tenemos la siguiente estructura en Kotlin, por ejemplo:
val allExams = setOf("A", "B", "C", "D", "E", "F") val examMap = mutableMapOf<String, Set<String>>() examMap["1"] = setOf("A","B") examMap["2"] = setOf("A","B","C") examMap["3"] = setOf("A","B","C","D") examMap["4"] = setOf("E") examMap["5"] = setOf("F")¿Cómo puedo filtrar para mantener solo los elementos del mapa con el número máximo de elementos coincidentes?
En dicho ejemplo, quiero eliminar examMap["1"] y examMap["2"] porque en examMap["3"] tengo "A" , "B" , "C" y "D" (que es el elemento con el número máximo de elementos coincidentes de allExams ). examMap["4"] y examMap["5"] deben mantenerse porque son los únicos elementos del mapa que tienen estos valores.
Así que al final quiero tener el mapa con los siguientes valores:
examMap["3"] = setOf("A","B","C","D") examMap["4"] = setOf("E") examMap["5"] = setOf("F")Esto le dará el resultado esperado:
val result = mutableMapOf<String, Set<String>>() examMap.toList().sortedByDescending { (_, v) -> v.size } .forEach { if (result.isEmpty() || result.values.none { rList -> rList.containsAll(it.second) }) { result.put(it.first, it.second) } } }La idea es:
set.size descendente. Porque, cuantos más elementos haya en el conjunto, más posibilidades tiene de cubrir otros conjuntosresult ) han contenido todos los elementos en el conjunto actual, para decidir si agregarlo al result Con la entrada dada, el result será:
{3=[A, B, C, D], 4=[E], 5=[F]}