Осталось объединить два списка - PullRequest
4 голосов
/ 24 июня 2019

Я хотел бы присоединиться к двум спискам без потери данных.Пример ниже:

// two lists
val b = List("John","Alice","Gregor","Mike")                 // base list
val l = List((List(1,2,3),"Mike"), (List(3,1,2), "Alice"))  // list to left join

// sorted
val bs = b.sorted        // List("Alice","Gregor","John","Mike")
val ls = l.sortBy(_._2)  // List((List(3,1,2), "Alice"),(List(1,2,3),"Mike"))


// left join - expected result:
// Alice and Mike found in both lists, Gregor and John appear only in the base list
// List(("Alice",(List(3,1,2),"Alice"), ("Gregor",Nil), ("John",Nil), ("Mike",List("Alice","Gregor","John","Mike"))))

Я нашел некоторые методы, но они мне не подходят:
- zip - простой «копировать / вставить» два списка,
- flatMap - удалить элементы, который не появляется в обоих списках.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 24 июня 2019

Попробуйте

b
  .map(key => key -> l.find(_._2 == key))
  .map {case (key, value) => key -> value.getOrElse(Nil) }

который выводит

List((John,List()), (Alice,(List(3, 1, 2),Alice)), (Gregor,List()), (Mike,(List(1, 2, 3),Mike))
1 голос
/ 24 июня 2019

Вы можете сделать это, используя Map:

val m = l.map(_.swap).toMap

val res = bs.map(elem => elem -> m.get(elem).map(_ -> elem).getOrElse(Nil))
println(res)
// Displays
// List((Alice,(List(3, 1, 2),Alice)), (Gregor,List()), (John,List()), (Mike,(List(1, 2, 3),Mike)))
1 голос
/ 24 июня 2019

Используя это

bs.map{
  str =>
    (str, ls.find(_._2 == str).getOrElse(Nil))
}

вы получите вывод как

List((Alice,(List(3, 1, 2),Alice)), (Gregor,List()), (John,List()), (Mike,(List(1, 2, 3),Mike)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...