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.

Transformar los valores del mapa a la clase de datos en Kotlin.

Tengo un mapa cuyos valores son una ArrayList de diferentes tipos de objetos (LocalDate, LocalTime, Float, List(Float)).

Me gustaría transformar los valores del mapa a una clase de datos personalizada que he creado.

He intentado realizar una destrucción de los componentes de los valores del mapa, sin embargo, estoy obteniendo el error “La inicialización de la declaración de destrucción de tipo Map.Entry<string, any=””> debe tener una función ‘component3()'”.

¿Cómo puedo realizar esta transformación a continuación?

Código de bloque

    val localDate1 = LocalDate.now()
    val localTime1 = LocalTime.now()
    val float1 = 1f
    val floatList1 = listOf<float>(1f, 2f, 3f)

    val localDate2 = LocalDate.now()
    val localTime2 = LocalTime.now()
    val float2 = 2f
    val floatList2 = listOf<float>(4f, 5f, 6f)

    val myMap = HashMap<string, any="">()
    myMap["keyOne"] = arrayListOf<any>(localDate1, localTime1, float1, floatList1)
    myMap["keyTwo"] = arrayListOf<any>(localDate2, localTime2, float2, floatList2)

    val newMap = myMap.mapValues { (date, time, float, floatList) -> /*Aquí estoy obteniendo un error de destrucción*/
        CustomObject(
            date,
            time,
            float,
            floatList
        )
    }

Código de bloque

kotlin
data class CustomObject (
val date: LocalDate,
val time: LocalTime,
val float: Float,
val floatList: List<float>
)
</string,></string,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para realizar la transformación de los valores del mapa a la clase de datos CustomObject, puedes utilizar la función mapValues en el mapa y proporcionar una lambda que utilice los valores de cada entrada del mapa para crear una nueva instancia de la clase de datos CustomObject.

    Sin embargo, dado que los valores en tu mapa original son de diferentes tipos, no puedes utilizar la destructuración directamente para extraerlos. En su lugar, puedes utilizar la función get en el mapa con el índice apropiado para recuperar cada valor de la listaArrayList.

    Aquí tienes un ejemplo de implementación:

    val newMap = myMap.mapValues { entry ->
        val values = entry.value as ArrayList<*>
        val date = values[0] as LocalDate
        val time = values[1] as LocalTime
        val float = values[2] as Float
        val floatList = values[3] as List<float>
        CustomObject(date, time, float, floatList)
    }
    

    En esta implementación, primero convertimos el valor Any de cada entrada del mapa a un ArrayList<*>' para poder recuperar los valores individuales por índice. Luego extraemos cada valor por su índice en la listaArrayList y lo convertimos al tipo apropiado. Finalmente, utilizamos estos valores extraídos para crear una nueva instancia de la clase de datosCustomObject`.

    Ten en cuenta que la función get devuelve un valor nullable, por lo que si alguno de los valores en la listaArrayList es nulo, deberás manejar esos casos adecuadamente para evitar errores en tiempo de ejecución.

Comments are closed.