Scala:过滤列表的多个元素

时间:2017-06-18 15:58:53

标签: scala filter functional-programming

假设我有这些scala类:

Task(id: String, pr: List[PhysicalResource])

PhysicalResource(id: String)

包含以下元素的list: List[PhysicalResource]

("PR1" :: "PR2" :: "PR3" :: "PR4" :: Nil)

这个obj: Task对象:

("T1", List(PhysicalResource("PR1"), PhysicalResource("PR3")))

我想返回列表中与对象的物理资源匹配的前两个元素(两个,因为obj.physicalResources.size = 2)。

在这个例子中,我想返回:

("PR1" :: "PR3" :: Nil)

我这样做,但它没有返回任何内容:

list.filter{x => obj.physicalResources.contains(x)}

有谁知道我该怎么做?

3 个答案:

答案 0 :(得分:0)

我最近提出了针对类似问题的通用解决方案:

def hasSubsequence[A](sup: List[A], sub: List[A]): Boolean = {
  def hasSubsequenceR[A](sup1: List[A], sub1: List[A]): Boolean = sup1 match {
    case x :: xs => sub1 match {
      case y :: ys if x == y => hasSubsequenceR(xs, ys)
      case Nil => true
      case _ => hasSubsequenceR(xs, sub)
   }
   case _ => false
 }
 hasSubsequenceR(sup, sub)
}

其中sup是您的list,sub是您的obj.pr

希望这有帮助

答案 1 :(得分:0)

我无法使用filter重现您的问题:

val resources: List[String] =
 ("PR1" :: "PR2" :: "PR3" :: "PR4" :: Nil)

// Representing obj.physicalResources
val physicalResources: List[String] =
 ("PR1" :: "Something Else" :: "PR3" :: Nil)

val filtered: List[String] =
  resources.filter{x => physicalResources.contains(x)}

println(filtered)

// Prints List(PR1, PR3)

但请尝试使用intersect

的方式
// Take the intersection of the 2 lists; the parts that are the same
println(resources.intersect(physicalResources))

// Prints List(PR1, PR3)

滚动你自己的方法来实现这一点似乎有些过分。

答案 2 :(得分:0)

如果我正确理解您的问题,您就会尝试将obj的PhysicalResource id与主list进行匹配。 id中的PhysicalResource obj列表为obj.pr.map(_.id),因此您可以在两个列表之间使用intersect来获取匹配的id,如下所示:

case class PhysicalResource(id: String)
case class Task(id: String, pr: List[PhysicalResource])

val list: List[String] = "PR1" :: "PR2" :: "PR3" :: "PR4" :: Nil

val obj: Task = Task("T1", List(PhysicalResource("PR1"), PhysicalResource("PR3")))

list.intersect(obj.pr.map(_.id))
res1: List[String] = List(PR1, PR3)