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.

groupBy por el valor del mapa en una lista de mapas

Tengo una lista de mapas como esta

val data = List(
           Map[String, String]("name" -> "Bob", "food" -> "pizza", "day" -> "monday"),
           Map[String, String]("name" -> "Ron", "food" -> "hotdog", "day" -> "tuesday"),
           Map[String, String]("name" -> "Tim", "food" -> "pizza", "day" -> "wednesday"),
           Map[String, String]("name" -> "Carl", "food" -> "hotdog", "day" -> "wednesday")
           )

Quiero crear un mapa como este a partir de esa lista de mapas

val result = Map("pizza" -> Map("name" -> ("Bob", "Tim"), "day" -> ("monday", "wednesday")),
                 "hotdog"-> Map("name" -> ("Ron", "Carl"), "day" -> ("tuesday", "wednesday")))

¿Cómo puedo lograr este resultado? Gracias

*pd Soy principiante en Scala

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes utilizar las funciones groupBy y mapValues. Aquí tienes una implementación de ejemplo:

    val groupedData = data.groupBy(_("food"))
    
    val result = groupedData.mapValues(foodData => {
      val names = foodData.map(_("name"))
      val days = foodData.map(_("day"))
      Map("name" -> (names.head, names.tail.head), "day" -> (days.head, days.tail.head))
    })
    

    Explicación: Primero, utilizamos groupBy para agrupar la lista original de mapas por la clave “food”, lo cual nos proporciona un Map de listas de mapas (donde cada lista contiene mapas con el mismo valor “food”). Luego, utilizamos mapValues para transformar cada entrada (es decir, cada lista de mapas) en el formato sub-mapa deseado.

    Para obtener los valores de “name” y “day” en cada sub-mapa, utilizamos la función map en la lista foodData para extraer los valores correspondientes de cada mapa, y luego utilizamos head y tail para obtener el primer y segundo elemento de cada lista resultante. Finalmente, creamos un nuevo Map con los valores de “name” y “day” como tuplas, y utilizamos la clave del resultado original de groupBy como clave para este sub-mapa.

    Ten en cuenta que esta implementación asume que cada valor de “food” aparece exactamente dos veces en la lista original de mapas, y que cada valor de “name” y “day” es único dentro de cada grupo.

Comments are closed.