2017-06-18 170 views
0

的多個元素假設我有這些階類:斯卡拉:篩選列表

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

是什麼'obj.physicalResources.contains(X)'返回? '過濾器'應該爲此工作,但我很難測試這個,因爲我有一段時間沒有使用Scala。你可以發佈[MCVE]嗎?我找不到'PhyscialResource'是什麼。 – Carcigenicate

回答

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和子是你的obj.pr

希望這有助於

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) 

滾動你自己的方法來完成,這似乎有點過分。

0

如果我正確理解您的問題,您正試圖將obj的PhysicalResource id s與主list相匹配。在obj PhysicalResource id S的名單是obj.pr.map(_.id),因此你可以使用兩個列表之間intersect得到匹配id S作爲如下:

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)