2014-12-15 3 views
13

Как преобразовать список кортежей List[(A,B)] в кортеж из списков (List[A], List[B])?Scala преобразовать список кортежей в кортеж из списков

Я попытался на следующий, но это выглядит сырой, и я надеялся, что там был лучший способ сделать это

val flat: List[AnyRef] = aAndB.map{ x => 
    x.map(y => List(y._1, y._2)) 
    }.flatMap(x => x) 

    val typeA: List[A] = flat.filter { 
    case x: A => true 
    case _ => false 
    }.map(_.asInstanceOf[A])  

    val typeB: List[B] = flat.filter { 
    case x: B => true 
    case _ => false 
    }.map(_.asInstanceOf[B]) 

ответ

25

Вы хотите unzip

scala> List((1,"a"), (3, "b"), (4, "d")).unzip 
res1: (List[Int], List[String]) = (List(1, 3, 4),List(a, b, d)) 

Аналогично есть unzip3 для List[Tuple3[A, B, C]], хотя что-то более высокого уровня, которое вам нужно было бы реализовать самостоятельно.

scala> List((1,"a", true), (3, "b", false), (4, "d", true)).unzip3 
res2: (List[Int], List[String], List[Boolean]) = (List(1, 3, 4),List(a, b, d),List(true, false, true)) 
+0

Для более высоких целей вы можете использовать [коллекции продуктов] (https://github.com/marklister/product-collections) –

Смежные вопросы