加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 给定序列中的元素,如何获取前一个元素?

发布时间:2020-12-16 19:12:30 所属栏目:安全 来源:网络整理
导读:假设我有一个 Scala列表列表(“apple”,“orange”,“banana”,“chinese gooseberry”)*.我想搜索此列表并返回列表中与我已有项目相关的上一项. 例如:getPrevious(fruit:String,fruits:List [String]):Option [String]应该返回 一些(“苹果”),如果我称
假设我有一个 Scala列表列表(“apple”,“orange”,“banana”,“chinese gooseberry”)*.我想搜索此列表并返回列表中与我已有项目相关的上一项.

例如:getPrevious(fruit:String,fruits:List [String]):Option [String]应该返回

>一些(“苹果”),如果我称它为“橙色”的水果arg;
>一些(“香蕉”)为“中国醋栗”;
>如果我用“apple”(不存在以前的元素)或“potato”(列表中没有)调用它,则为None.

很容易完成,但我怎么能以优雅的功能方式做到这一点?我能想到的最好的是以下内容:

def previous(fruit: String,fruits: List[String]): Option[String] =
  fruits.sliding(2)
  .filter { case List(previous,current) => current == fruit }
  .toList
  .headOption
  .map { case List(previous,current) => previous }

它有效,但它不优雅或高效.我特别讨厌将过滤器迭代器转换为List.我怎样才能改进它?

(*另外,列出用于滑动迭代的最佳集合?)

解决方法

我认为这是一种直接递归和模式匹配既高效又易于阅读的情况:

@annotation.tailrec
def getPrevious(fruit: String,fruits: List[String]): Option[String] = fruits match  {
  case Nil               => None
  case x :: `fruit` :: _ => Some(x)
  case _ :: xs           => getPrevious(fruit,xs)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读