es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La combinación de múltiples predicados no funciona.

Estoy tratando de filtrar ciertos elementos de una lista y combinarlos en la lista final en un orden específico. El primer fragmento de código parece ineficiente ya que crea 2 listas para filtrar y luego itera sobre ellas, sin embargo, ese código funciona. El segundo fragmento de código intenta combinar ambos filtrados, sin embargo, el operador de mapeo no está agregando elementos a la lista otherNums. ¿Podría alguien ayudarme a entender por qué está sucediendo esto?

Fragmento de código 1:

fun main() {
val favItem = 0
val list = listOf(11, 12, 13, 2,3,4,5,6,7,10, favItem)

val greaterThan10 = list.filter{item -> item > 10}
val otherNums = list.asSequence().filter{item -> item != favItem}.filter{item -> item < 10}

println(" $greaterThan10") //la lista está llena de números apropiados

println("lista combinada ${greaterThan10.plus(favItem).plus(otherNums)}")

}

Resultado:

[11, 12, 13]
lista combinada [11, 12, 13, 0, 2, 3, 4, 5, 6, 7]

Fragmento de código 2:

fun main() {
val favItem = 0
val list = listOf(11, 12, 13, 2,3,4,5,6,7,10, favItem)

val greaterThan10 = mutableListOf<int>()
val otherNums = list.asSequence().filter{item -> item != favItem}.map{
    if(it > 10) {
        greaterThan10.add(it)
    }
    it
}
.filter{item -> item != 10}

println("$greaterThan10") //la lista está vacía

println("lista combinada ${greaterThan10.plus(favItem).plus(otherNums)}")

}

Resultado:

[]
lista combinada [0, 11, 12, 13, 2, 3, 4, 5, 6, 7]

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En el Fragmento de Código 2, el operador map no está agregando elementos a la lista greaterThan10 porque map es una operación perezosa, lo que significa que solo se ejecutará cuando la secuencia resultante realmente se use. En este caso, la operación filter que sigue al map no es suficiente para activar la ejecución de la operación map, ya que también es una operación perezosa.

    Para solucionar este problema, podemos usar el operador toList después de la operación map, lo que obligará a evaluar la secuencia y llenar la lista greaterThan10.

    Fragmento de Código 2 Actualizado:

    fun main() {
        val favItem = 0
        val list = listOf(11, 12, 13, 2,3,4,5,6,7,10, favItem)
    
        val greaterThan10 = mutableListOf<int>()
        val otherNums = list.asSequence()
            .filter{item -> item != favItem}
            .map{
                if(it > 10) {
                    greaterThan10.add(it)
                }
                it
            }
            .filter{item -> item != 10}
            .toList() // evaluar la secuencia y convertirla en una lista
    
        println("$greaterThan10") // la lista está llena con los números apropiados
    
        println("merged list ${greaterThan10.plus(favItem).plus(otherNums)}")
    }
    

    Resultado:

     [11, 12, 13]
    merged list [11, 12, 13, 0, 2, 3, 4, 5, 6, 7]</int>
    

Comments are closed.