假设我有这些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)}
有谁知道我该怎么做?
答案 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)