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

scala – 如何使用函数式编程在列表中返回所有正数和第一个负数

发布时间:2020-12-16 09:23:02 所属栏目:安全 来源:网络整理
导读:想象一下,我有一个未分类的正面和负面内在我想返回一个包含所有正整数和第一个负数的列表,但是从列表中忽略所有后续的负数,同时保留排序. 我可以做的: l = [1,2,-4,5,-6,-1,3]out = []first = truefor n in l: if n = 0: out.push(n) else if first: out.pu
想象一下,我有一个未分类的正面和负面内在我想返回一个包含所有正整数和第一个负数的列表,但是从列表中忽略所有后续的负数,同时保留排序.

我可以做的:

l = [1,2,-4,5,-6,-1,3]
out = []
first = true
for n in l:
    if n >= 0:
        out.push(n)
    else if first:
        out.push(n)
        first = false

// out = [1,3]

在Scala中如何用FP进行此操作?我在想(可能不会编译…):

val l = List(1,3)
val posl = l.map(_ >= 0)
val negl = l.zipWithIndex.map((n,i) => if (n < 0) (i,n) else (None,None)).head
// now split posl at negl._1,and create a new list of leftSlice :: negl._2 :: rightSlice?

这是正确的方法,还是有更加优雅,简洁的方式?

解决方法

这是一种尾递归的方式.与m-z的答案相比,它只会重复一次,与Dimas答案相比,它不使用可变状态,因此它是纯功能的.

def firstNegAllPos(list: List[Int]) : List[Int] = {
  def loop(in: List[Int],out: List[Int],negfound: Boolean) : List [Int] = {
    in match {
      case Nil => out
      case head :: tail =>
        if (negfound)
          loop(tail,if (head < 0) out else head :: out,true)
        else
          loop(tail,head :: out,head < 0)
    }
  }
  loop(list,Nil,false)
}

firstNegAllPos(List(1,3)) // List(3,1)

编辑:

上述实现提供了相反的结果.为了保存订单,您可以执行以下操作:

def firstNegAllPos(list: List[Int]) : List[Int] = {
  def loop(in: List[Int],false).reverse
}

firstNegAllPos(List(1,3)) // List(1,3)

(编辑:李大同)

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

    推荐文章
      热点阅读