Digamos que tengo:

val list: List[(Long, Boolean)] = List((0, false), (0, true), (1, true), (1, true))

Y al final quiero:

List((0, false), (1, true))

Donde la lista "Combinada" "Agrupa por" _1 y luego "lógicamente" y los resultados.

Puedo hacer esto con iteración, pero parece que Scala y la programación funcional en general deberían poder usar un conjunto de funciones para realizar esta transformación.

2
Matthew Hoggan 25 may. 2017 a las 19:39

2 respuestas

La mejor respuesta
val result = list.groupBy(_._1) // group by key
  .mapValues(_.map(_._2))       // remove keys from grouped values
  .mapValues(_.reduce(_ && _))  // reduce grouped values using &&
3
Tzach Zohar 25 may. 2017 a las 16:42

Utilice List#groupBy seguido de una secuencia de operaciones de mapa / reducción:

scala> List((0, false), (0, true), (1, true), (1, true))
res0: List[(Int, Boolean)] =
  List((0,false), (0,true), (1,true), (1,true))

scala> .groupBy(_._1)
res1: scala.collection.immutable.Map[Int,List[(Int, Boolean)]] =
  Map(1 -> List((1,true), (1,true)), 0 -> List((0,false), (0,true)))

scala> .mapValues(_.map(_._2))
res2: scala.collection.immutable.Map[Int,List[Boolean]] =
  Map(1 -> List(true, true), 0 -> List(false, true))

scala> .mapValues(_.reduce(_ && _))
res3: scala.collection.immutable.Map[Int,Boolean] =
  Map(1 -> false, 0 -> true)

scala> .toList
res4: List[(Int, Boolean)] =
  List((1,false), (0,true))
1
OlivierBlanvillain 25 may. 2017 a las 16:50