在scala中将两个列表一起排序

Ale*_*lex 4 functional-programming scala list

说我有两个清单:

List(("a",1),("b",4),("d",5),("a",7),("b",6)) 
Run Code Online (Sandbox Code Playgroud)

List("a","b","c","d")
Run Code Online (Sandbox Code Playgroud)

我想根据第一个列表对它们进行分组,以便我得到:

List("a" -> List(("a",1),("a",7)), "b" -> List(("b",4),("b",6)), "d" -> List(("d",5)))
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最佳方法是什么?我知道我可以使用groupBy和模式匹配预先确定的值,但是当第二个列表没有预先确定时,我会有点卡住.

编辑:

我需要第二个列表中的对象副本作为已处理列表的键.我可能需要通过第二个列表中的on对象的参数进行分组,但仍然将整个对象保持为键...如果这是有意义的.

List(("a",1),("b",4),("d",5),("a",7),("b",6)) 
List(("a",1,1),("b",2,3),("c",5,6),("d",6,7))
Run Code Online (Sandbox Code Playgroud)

变为:

 List(("a",1,1) -> List(("a",1),("a",7)), ("b",2,3) -> List(("b",4),("b",6)), ("d",6,7) -> List(("d",5)))
Run Code Online (Sandbox Code Playgroud)

对不起,不清楚!

Tra*_*own 5

根据您的编辑,使用for-comprehension:

for {
  key <- second
  pair <- first.groupBy(_._1).get(key)
} yield key -> pair
Run Code Online (Sandbox Code Playgroud)

或者未经检验的等价物:

second.flatMap(key => first.groupBy(_._1).get(key).map(key -> _))
Run Code Online (Sandbox Code Playgroud)

这两个都执行groupBy每个键的操作.如果这是一个问题,你当然可以通过稍微详细一点来避免它:

val mappings = first.groupBy(_._1)
second.flatMap(key => mappings.get(key).map(key -> _))
Run Code Online (Sandbox Code Playgroud)

并解决您的新编辑问题:如果您需要转换第二个列表中的每个项目以将其用作第一个项目的关键,那么您可以通过以下几种方式进行转换.例如,给定:

val first = List(("a", 1), ("b", 4), ("d", 5), ("a", 7), ("b", 6))
val second = List(("a", 1, 1), ("b", 2, 3), ("c", 5, 6), ("d", 6, 7))
Run Code Online (Sandbox Code Playgroud)

或者:

for {
  item @ (key, _, _) <- second
  pair <- first.groupBy(_._1).get(key)
} yield item -> pair
Run Code Online (Sandbox Code Playgroud)

要么:

for {
  item <- second
  pair <- first.groupBy(_._1).get(item._1)
} yield item -> pair
Run Code Online (Sandbox Code Playgroud)

按需工作.