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 programación funcional de Kotlin mantiene la referencia del objeto previo en una lista.

Tengo una lista de objetos Person que están relacionados entre sí mediante la relación de cónyuge en el orden en el que aparecen en la lista.

enum class Gender {
MAN, WOMAN
}
data class Person(val name: String, val age: Int, val gender: Gender)

En la lista, cada Persona con género HOMBRE es el cónyuge de la siguiente Persona con género MUJER (y viceversa) y cada entrada en la lista está seguida de géneros alternantes con el género HOMBRE siendo el primero.

La lista idealmente debería ser como [HOMBRE, MUJER, HOMBRE, MUJER, HOMBRE, MUJER] (obviamente será una lista de objetos Person para simplificar estoy poniendo una lista de Género aquí) pero también podría ser como [MUJER, HOMBRE, MUJER, HOMBRE, MUJER, HOMBRE]. En este último caso, la primera MUJER que aparece es la cónyuge del último HOMBRE que aparece.

¿Cómo se podría manejar este segundo caso en Kotlin mediante la programación funcional?
Mi enfoque actual implica verificar si la primera Persona tiene un género femenino, luego eliminar el primer y último objeto en la lista y luego agregarlos al final, pero esto no es completamente una solución de programación funcional.

¿Alguien puede guiarme al respecto?

Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Puede utilizar la función fold para manejar el segundo caso. La función fold toma un valor inicial y una función como parámetros y aplica la función al valor inicial y a cada elemento de la lista. En este caso, puede utilizar la función fold para verificar el género del primer elemento de la lista y luego utilizar la función para reorganizar la lista en consecuencia.

    Por ejemplo, si el primer elemento es una MUJER, puede utilizar la función fold para eliminar el primer y último elemento de la lista y agregarlos al final de la lista.

    Aquí hay un ejemplo de cómo puede usar la función fold para manejar el segundo caso:

    val lista = listOf(Person("John", 30, Gender.MAN), Person("Jane", 28, Gender.WOMAN), Person("Jack", 32, Gender.MAN), Person("Jill", 30, Gender.WOMAN))
    
    val resultado = lista.fold(listOf<person>()) { acc, persona ->
        if (acc.isEmpty() && persona.gender == Gender.WOMAN) {
            lista.dropLast(1) + lista.take(1)
        } else {
            acc + persona
        }
    }
    

    El resultado será una lista de objetos Person con el orden correcto.

Comments are closed.