簡體   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