[英]How to filter a Seq in Scala
我有一個問題,我有一個Scala Seq of Fruit Objects,其中對象的名稱成員變量是水果的名稱,例如
fruits: Seq[Fruit] = List(banana, apple, jackfruit, pineapple, grapes, watermelon, papaya, orange, pomegranate, strawberry)
我有一個scala字符串,其中包含以逗號分隔的水果的名稱,例如
val ilike = "apple, grapes, watermelon, guava"
我需要過濾上面的Seq,使其僅包含我喜歡的Fruit的對象,這就是結果,
fruits: Seq[Fruit] = List(apple, grapes, watermelon)
我嘗試了Java方式,但是我對如何以Scala方式進行相同的工作很感興趣。 我用谷歌搜索了一下,但是找不到正確的答案。
提前謝謝你的幫助。
如果ilike
包含一個其子字符串位於fruit
中的名稱,則僅使用ilike.contains
作為過濾器函數將失敗:
scala> val ilike = "pineapple, grapes, watermelon, guava"
ilike: String = pineapple, grapes, watermelon, guava
scala> fruits.filter(ilike.contains)
res1: Seq[String] = List(apple, pineapple, grapes, watermelon)
因此,應該先將ilike
分為一系列偏好設置:
scala> val like = ilike.split(", ")
like: Array[String] = Array(pineapple, grapes, watermelon, guava)
現在可以安全地使用like.contains
進行過濾:
scala> fruits.filter(like.contains)
res3: Seq[String] = List(pineapple, grapes, watermelon)
編輯:如果水果包含帶有name
成員的Fruit
實例列表,則只需使用
scala> fruits.filter(f => like.contains(f.name)
res3: Seq[Fruit] = List(pineapple, grapes, watermelon)
更加簡潔的方法-使用intersect
scala> val like = ilike.split(", ")
like: Array[String] = Array(pineapple, grapes, watermelon, guava)
scala> fruits.intersect(like)
res1: Seq[String] = List(pineapple, grapes, watermelon)
很簡單:
fruits.filter(f=>ilike.split(",").contains(f.name))
考慮到1.這可能是正確的答案嗎?1.我喜歡的值可以為空。 如果為空,則返回Seq應該是結果。 2.值可以用逗號或逗號和空格分隔。
if(ilike != "") {
val like = for(i <- ilike.split(",")) yield i.trim
fruits.filter(f => like.contains(f.name))
} else {
fruits
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.