我有一个问题,我有一个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搜索了一下,但我找不到正确的答案。
提前感谢您的帮助。
答案 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)
编辑:
如果水果包含Fruit
个name
成员列表,请使用
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
}