从2个给定列表中获取共同元素

时间:2016-07-09 15:01:43

标签: scala listbuffer

所以我有2 collections

import collection.mutable.ListBuffer

val list1 = ListBuffer[(String, String)]()
list1 += (("Italy", "valid"))
list1 += (("Germany", "not valid"))
list1 += (("USA", "not valid"))
list1 += (("Romania", "valid"))

val list2 = ListBuffer[String]()
list2 += "Germany"
list2 += "USA"
list2 += "Romania"
list2 += "Italy"
list2 += "France"
list2 += "Croatia"

我想获取包含具有特定condition的公共国家/地区valid的新列表,因此结果将是新列表:

Italy, Romania

4 个答案:

答案 0 :(得分:6)

如果您需要同时filtermap,请使用collect

list1.collect { case (c, "valid") => c } intersect list2

答案 1 :(得分:1)

使用for comprehension如下,

for ((a,"valid") <- list1 if list2.contains(a)) yield a

这种理解涉及flatMap和懒惰的过滤器。我们模式匹配(提取)第二个项目匹配&#34; valid"的元组,并检查验证的国家是否属于第二个列表。

答案 2 :(得分:0)

我认为你应该过滤,映射然后交叉

list1 filter(_._2=="valid") map(_._1) intersect list2

答案 3 :(得分:0)

您可以定义以下方法:

def intersectWithCond[A, B](xs: Seq[(A, B)], ys: Seq[A])(cond: B => Boolean): Seq[A] = {
  xs.filter(x => cond(x._2)).map(_._1).intersect(ys)
}

用法:

intersectWithCond(list1, list2)(_ == "valid") // returns ListBuffer(Italy, Romania)