繁体   English   中英

如何在Scala中过滤Seq

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM