2014-11-21 2 views
0

У меня есть два спискаКак получить комбинированные списки из двух списков с помощью scala?

val list1 = List((List("AAA"),"B1","C1"),(List("BBB"),"B2","C2")) 
val list2 = List(("AAA",List("a","b","c")),("BBB",List("c","d","e"))) 

Я хочу, чтобы соответствовать первому элементу из list2 с первым элементом list1 и получить объединенный список. Я хочу выход как -

List((List("AAA"),"B1","C1",List("a","b","c"))) 

Как получить выше вывод, используя Scala ??

+0

песни2 не является действительным списком; возможно, вы можете это исправить, и мы можем идти оттуда? В частности, эти квадратные скобки не имеют смысла в этом контексте. – jamesmulcahy

+0

Можете ли вы увидеть мое редактирование сейчас. – Yogesh

+0

Не могли бы вы привести больше примеров или перефразировать то, что вы хотите? «Первый элемент из списка2 с первым элементом списка1 и получить объединенный список» будет List ((List («AAA»), «B1», «C1»), («AAA», List («a», «b», , "c"))), а не список, который вы дали. – red1ynx

ответ

0

Это то, что я придумал:

scala> val l1 = List((List("AAA"),"B1","C1"),(List("BBB"),"B2","C2")) 
l1: List[(List[String], String, String)] = List((List(AAA),B1,C1), (List(BBB),B2,C2)) 

scala> val l2 = List((List("AAA"), List("a", "b", "c")), (List("BBB"), List("c", "d", "e"))) 
l2: List[(String, List[String])] = List((AAA,List(a, b, c)), (BBB,List(c, d, e))) 

scala> l1.collectFirst { 
    | case tp => l2.find(tp2 => tp2._1.head == tp._1.head).map(founded => (tp._1, tp._2, tp._3, founded._2)) 
    | }.flatten 
res2: Option[(List[String], String, String, List[String])] = Some((List(AAA),B1,C1,List(a, b, c))) 

Вы можете использовать collectFirst для фильтрации значений вы не хотите, и на каждом наборе вы используете find на втором списке и отобразить его в кортеж вы хотите ,

Несколько примечаний, это ужасно, я не знаю, как вы получили с Tuple4 в первую очередь, лично я ненавижу все, что tp._* нотацию, это трудно читать, думать об использовании классов случая, чтобы обернуть все что в какую-то более управляемую структуру, во-вторых, мне пришлось использовать .head, который в случае пустого списка выдаст исключение, поэтому вы можете сделать некоторые проверки до этого, но, как я уже сказал, я бы полностью просмотрел свой код и не тратил время на работу на некоторых недостатках архитектуры в первую очередь.

+0

Второй список немного отличается от вашего второго списка – Yogesh

+0

Извините, я пропустил то, что вам нужно только первое совпадение, вы можете использовать 'collectFirst' вместо' collect' –

+0

Я бы предпочел предложение Ende получить исходные данные в более разумные данные структур. – jamesmulcahy

0

Вы можете использовать zip объединить и перечень

val list1 = List((List("AAA"),"B1","C1"),(List("BBB"),"B2","C2")) 
val list2 = List(("AAA",List("a","b","c")),("BBB",List("c","d","e"))) 

val combinedList = (list1 zip list2) 
combinedList.head will give you the desired result 

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