Estoy tratando de combinar registros almacenados como List en uno List, donde solo una columna con valores no únicos es un List, el resto de List son elementos individuales

A continuación se muestra el ejemplo de lo que quiero decir con esto:

val list1 = List(1, 2, "abcd", 5)
val list2 = List(1, 2, "efgh", 5)

Lo que necesito después de fusionarme es algo como esto:

List(1, 2, List("abcd", "efgh"), 5)

Soy muy nueva en Scala, así que agradecería tu ayuda.

1
R J.B. 25 feb. 2020 a las 17:54

2 respuestas

La mejor respuesta

Todas las listas son de la misma longitud y siempre el tercer elemento es el divergente.

Luego use una tupla, sería mejor modelar sus datos, preservaría la información de tipo y sería más fácil hacer la combinación.

def merge[A, B, C, D](t1: (A, B, C, D), t2: (A, B, C, D)): Option[(A, B, (C, C), D)] =
  t1 match {
    case (a, b, c1, d) =>
      t2 match {
        case (`a`, `b`, c2, `d`) => Some((a, b, (c1, c2), d))
        case _ => None // The other elements not where equal.
      }
  }
3
Luis Miguel Mejía Suárez 25 feb. 2020 a las 15:24
for ((x,y) <- list1.zip(list2)) yield if (x == y) x else List(x,y)
  • zip combina las dos listas y le da una lista de pares
  • la comprensión for pasa por estos pares. Si ambos son iguales, solo produce el primer elemento, de lo contrario, una lista que contiene ambos elementos.

Su código podría ser más simple si logra mantener sus listas homogéneas, es decir, todos los elementos que tengan el mismo tipo.

4
peq 25 feb. 2020 a las 15:02