如何在Scala中过滤Seq

时间:2015-07-07 12:36:34

标签: scala

我有一个问题,我有一个Scala Seq of Fruit Objects,其中对象的名称成员变量是水果的名称,如

fruits: Seq[Fruit] = List(banana, apple, jackfruit, pineapple, grapes, watermelon, papaya, orange, pomegranate, strawberry)

我有一个scala String,其中包含用逗号分隔的水果名称,如

val ilike = "apple, grapes, watermelon, guava"

我需要过滤上面的Seq,使它只包含我喜欢的Fruit对象,结果应该是,

fruits: Seq[Fruit] = List(apple, grapes, watermelon)

我尝试了Java方式,但我感兴趣的是如何以Scala的方式工作。我用Google搜索了一下,但我找不到正确的答案。

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

如果ilike.contains包含其子字符串位于ilike的名称,则仅使用fruit作为过滤功能失败:

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)

编辑: 如果水果包含Fruitname成员列表,请使用

scala> fruits.filter(f => like.contains(f.name)
res3: Seq[Fruit] = List(pineapple, grapes, watermelon)

答案 1 :(得分:4)

更简洁的方式 - 使用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)

答案 2 :(得分:1)

这么简单:

  fruits.filter(f=>ilike.split(",").contains(f.name))

答案 3 :(得分:0)

考虑到这可能是正确的答案  1. val ilike可以是空的。如果它是空的,那么返回Seq应该是水果。  2. ilike可以用逗号或逗号和空格分隔。

if(ilike != "") {
  val like = for(i <- ilike.split(",")) yield i.trim
  fruits.filter(f => like.contains(f.name))
} else {
  fruits
}