假设我有两个列表:
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/