2015-09-29 9 views
0

Я новичок в Scala. У меня есть три списка.Как объединить элементы нескольких списков в scala

List("XX", None,None,None) 

List(None,"YY",None,None) 

List(None,None,None, "ZZ") 

Мне нужно объединить этот список, чтобы создать единый список, который должен выглядеть как

List("XX","YY",None,"ZZ") 

Есть ли способ в Скале, чтобы достичь такого результата? Спасибо

+1

Имеет значение вопрос? Всегда ли типы String или None? – roterl

ответ

3

Ваши списки List[AnyRef]. Это тип, который никогда не должен появляться в обычном коде Scala.

Я хотел бы предложить, представляющий данные с помощью List[Option[String]]:

scala> List(List(Some("XX"), None, None, None), 
    |  List(None, Some("YY"), None, None), 
    |  List(None, None, None, Some("ZZ"))) 
res2: List[List[Option[String]]] = List(... 

Теперь проблему легко решить:

scala> res2.transpose.map(_.flatten.headOption) 
res6: List[Option[String]] = List(Some(XX), Some(YY), None, Some(ZZ)) 

Я здесь предполагается, что, если есть несколько Some s в то же позиции, вы хотите взять первый.

5

Возможно, вам это нужно?

val list: List[List[Option[String]]] = List(
    List(Some("XX"), None, None, None), 
    List(None, Some("YY"), None, None), 
    List(None, None, None, Some("ZZ")) 
) 
list.tail.foldLeft(list.head) { 
    case (acc, item) => acc.zip(item).map { 
    case (Some(x), _) => Some(x) 
    case (_, y) => y 
    } 
} 
+1

Функция fold может быть '{case (a, x) => (a, x) .zipped map {case (y, z) => y orElse z}}', где zipped позволяет избежать промежуточной коллекции. –

2
val l1 = List("XX", None, None, None) 
val l2 = List(None, "YY", None, None) 
val l3 = List(None, None, None, "ZZ") 

val listOfList = List(l1, l2, l3) 

// Assuming all lists are of same length. 

val lT = listOfList.transpose // swap column and rows 
val result = lT.map{ _.reduce{ (a, b) => 
    if (a.toString == "None") b else a 
}} 
// List[Serializable] = List(XX, YY, None, ZZ) 
+0

Тестирование для 'None' таким образом является особенно строгим (т. Е. Плохо). Плохо, как ужасно. –

+0

@ som-snytt пункт принят. но исходя из данных, это способ достижения результата. другие заявили, что отправной точкой должен быть список вариантов. Согласен. –

2

Для

val xs = List(list1,list2,list2) 

считают

xs.flatten.distinct 
Смежные вопросы