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

Scala 从2个给定列表中获取公共元素,scala,listbuffer,Scala,Listbuffer,因此,我有两个集合: 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[Stri

因此,我有两个
集合

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"
我想获得新列表,其中包含具有特定
条件的常见国家/地区
,例如
有效
,因此结果将是新列表:

Italy, Romania

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

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

您可以定义以下方法:

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)

当您需要同时进行
筛选
映射
时,请使用
收集

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

使用a进行如下理解:

for ((a,"valid") <- list1 if list2.contains(a)) yield a
((a,“有效”)的