list - 在 Scala 中对两个列表进行排序

标签 list scala functional-programming

假设我有两个列表:

List(("a",1),("b",4),("d",5),("a",7),("b",6)) 


List("a","b","c","d")

我想根据第一个列表对它们进行分组,以便我得到:
List("a" -> List(("a",1),("a",7)), "b" -> List(("b",4),("b",6)), "d" -> List(("d",5)))

实现这一目标的最佳方法是什么?我知道我可以对预先确定的值使用 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))

变成:
 List(("a",1,1) -> List(("a",1),("a",7)), ("b",2,3) -> List(("b",4),("b",6)), ("d",6,7) -> List(("d",5)))

抱歉不清楚!

最佳答案

根据您的编辑,带有 for -理解:

for {
  key <- second
  pair <- first.groupBy(_._1).get(key)
} yield key -> pair

或无糖等价物:
second.flatMap(key => first.groupBy(_._1).get(key).map(key -> _))

这两个都执行 groupBy每个键的操作。如果这是一个问题,您当然可以使用稍微详细一点的方法来避免它:
val mappings = first.groupBy(_._1)
second.flatMap(key => mappings.get(key).map(key -> _))

并解决您的新编辑:如果您需要转换第二个列表中的每个项目以将其用作第一个列表的键,您可以通过几种方法来实现。例如,给定:
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))

任何一个:
for {
  item @ (key, _, _) <- second
  pair <- first.groupBy(_._1).get(key)
} yield item -> pair

或者:
for {
  item <- second
  pair <- first.groupBy(_._1).get(item._1)
} yield item -> pair

根据需要工作。

关于list - 在 Scala 中对两个列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11776661/

相关文章:

scala - 将新包添加到 sbt Scala 项目

python - 从列表字典创建 n 个嵌套循环

python - 将 NumPy 数组转换为 Python 列表

regex - 无法匹配正则表达式中的字符串文字

c++ - std::transform 与 std::for_each 不同吗?

haskell - 函数组合问题

java - 将类 Java 2D 动态规划矩阵转换为 Haskell

python - 如何检查列表是否包含空字符串

java - 如何在 Java 中循环遍历 ArrayList 并检查它是否包含另一个 ArrayList 中的值

scala - 在 Scala 中连接两个长度不等的列表