En este tutorial aprenderás a cómo usar la función flatten
en Kotlin para combinar los elementos de colecciones anidadas en una sola lista.
Sintaxis De flatten()
La función flatten()
te permite aplanar colecciones anidadas, es decir, colecciones con elementos que son colecciones.
El resultado final será una lista con la combinación de todos los elementos de las colecciones del interior. Clarifiquemos esta idea con una ilustración:
Tenemos una lista con dos elementos: las listas L0 = [1, 3, 5, 7]
y L1 = [0, 1, 1, 2]
. Luego de aplicar flatten()
, el retorno es una nueva lista con la unión de todos los elementos.
Si materializas el ejemplo anterior en Kotlin, tendrías lo siguiente:
fun main() {
val numbers = listOf(
listOf(1, 3, 5, 7),
listOf(0, 1, 1, 2)
)
println(numbers.flatten()) // [1, 3, 5, 7, 0, 1, 1, 2]
}
La función de extensión flatten()
solo está disponible para las colecciones anidadas, ya que su tipo recibidor lo hace explícito en la sintaxis de definición:
// Arreglos anidados
fun <T> Array<out Array<out T>>.flatten(): List<T>
// Iterables anidados
fun <T> Iterable<Iterable<T>>.flatten(): List<T>
Por esta razón no podrás usar flatten()
en colecciones regulares, arreglos de iterables o en iterables de arreglos.
fun main() {
val arrayOfLists = arrayOf(listOf(1, 2), listOf(2, 4))
val normalSet = setOf("xy", "yz", "xz")
println(arrayOfLists.flatten()) // Unresolved reference
println(normalSet.flatten()) // Unresolver reference
}
Ejemplo De flatten() En Arreglo Anidado
Supongamos que deseamos vectorizar una matriz de 3×3, esto es, convertirla en un vector. Luego de ello se requiere reducir el vector a una colección sin elementos repetidos, ordenarlos de mayor a menor e imprimirlos:
fun main() {
val matrix = arrayOf(
arrayOf(3, 1, 2),
arrayOf(-4, 1, 3),
arrayOf(1, 3, 5)
)
println(
matrix.flatten() // [3, 1, 2, -4, 1, 3, 1, 3, 5]
.toSet() // [3, 1, 2, -4, 5]
.sorted() // [-4, 1, 2, 3, 5]
)
}
Una forma de hacerlo es invocando a la función flatten()
desde la matriz. Esto aplicará una trasformación lineal sobre ella, cuyo resultado será el vector [3, 1, 2, -4, 1, 3, 1, 3, 5]
.
Luego puedes eliminar los elementos duplicados usando toSet()
o la función distinct()
. Esto nos dejará con [3, 1, 2, -4, 5]
.
Finalmente ordenamos de mayor a menor con sorted()
lo que resulta en [-4, 1, 2, 3, 5]
.
Ejemplo De flatten() En Lista Anidada
Consideremos la asistencia de varias familias a un evento. Cada integrante participará en la rifa de un gran premio y para ello necesitamos juntar todos los nombres en una bolsa, de donde se sacará al ganador al azar.
fun main() {
val families = listOf(
listOf("Miguel", "Paula"),
listOf("Yadira", "Guillermo"),
listOf("Paty", "Carlos"),
listOf("Camilo", "Berenice")
)
println(families.flatten().random()) // Nombre aleatorio
}
El anterior código simula el comportamiento enunciado. Las familias son representadas por una lista con listas de los integrantes. Ponerlos a todos en juego requiere llamar a flatten()
.
Finalmente el ganador es elegido aleatoriamente con la función random()
, la cual retorna un elemento de la colección con un algoritmo de azar.