【问题标题】:How to filter a Seq in Scala如何在 Scala 中过滤 Seq
【发布时间】:2015-07-07 12:36:34
【问题描述】:

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

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 方式工作很感兴趣。我google了一下,没找到正确答案。

提前感谢您的帮助。

【问题讨论】:

  • 如果您认为答案是正确的,您应该点击复选标志接受它。欢迎使用 StackOverFlow!
  • 你能描述一下你的水果课吗?它是否有任何属性可以等于“苹果、葡萄、西瓜、番石榴”之一?
  • Fruit 类有一个成员变量 name,其中 name 保存了水果的名称。

标签: scala


【解决方案1】:

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

    如果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)
    

    编辑: 如果 fruits 包含一个带有 name 成员的 Fruit 实例列表,则只需使用

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

    【讨论】:

      【解决方案3】:

      这么简单:

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

      【讨论】:

      • 感谢您的回复。我已经编辑了问题,你能重新回答吗?
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-05-01
        • 2022-08-23
        • 2017-07-14
        • 1970-01-01
        • 2017-09-15
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        • 1970-01-01
        相关资源
        最近更新 更多