2012-06-19 70 views
1

我有2個系列:aclass C的一個Scala對象序列。 b是一串字符串。 C有一個字符串字段,name,可能會匹配b中的一個項目。我想要的是循環通過a,並找到所有c.nameb中的一個項目匹配。我如何在Scala中做到這一點?Scala遍歷2個集合並查找匹配結果

回答

4

迭代遍歷a和b會變得昂貴,因爲一個循環嵌套在另一個循環內會產生O(n^2)時間。如果b足夠大,則可能需要先將其設置爲Set,然後將其設置爲O(n)。

val bSet = b.toSet; 
a.filter(c => b.contains(c.name)) 

我看這是「應用下面的過濾器的結果:C中的每個項目,包括它在結果當且僅當C的名字是在B」。

+0

你我的朋友是搖滾明星!謝謝, – Bob

+2

如果b足夠大,您可能需要先將其設置爲Set,例如: val bSet = b.toSet; a.filter(c => b.contains(c.name)) –

+0

感謝您的建議,亞歷克斯,但爲什麼使它成爲第一個定義足夠大。 – Bob

1

下面是與yield相當的循環。

for(c <- a if b.contains(c.name)) yield c.name