【问题标题】:Get common element from 2 given lists从 2 个给定列表中获取公共元素
【发布时间】:2025-12-24 06:20:15
【问题描述】:

所以我有这个 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

【问题讨论】:

    标签: scala listbuffer


    【解决方案1】:

    当你需要同时filtermap时,使用collect

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

    【讨论】:

      【解决方案2】:

      如下使用 for 理解,

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

      这种理解去糖化为 flatMap 和惰性过滤器。我们对第二项匹配“valid"”的元组进行模式匹配(提取),并检查已验证国家是否属于第二个列表。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          您可以定义以下方法:

          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)
          

          【讨论】:

            最近更新 更多