Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 除了第一个负数外,如何从序列中删除负数?_Scala - Fatal编程技术网

Scala 除了第一个负数外,如何从序列中删除负数?

Scala 除了第一个负数外,如何从序列中删除负数?,scala,Scala,如何从序列中删除除第一个负数以外的所有负数。我不知道如何保留第一个负数,然后删除其他负数 def negativeNumbers(sequence: Iterable[Int]): Iterable[Int] = { sequence.filter(_ > 0) return sequence } negativeNumbers(Seq(6, 2, -4, 7, 9, 10, -15, 8, -20)) 执行之后,我应该得到Seq(6,2,-4,7,9,10,8) 因为-4

如何从序列中删除除第一个负数以外的所有负数。我不知道如何保留第一个负数,然后删除其他负数

def negativeNumbers(sequence: Iterable[Int]): Iterable[Int] = {
   sequence.filter(_ > 0)
   return sequence
}

negativeNumbers(Seq(6, 2, -4, 7, 9, 10, -15, 8, -20))
执行之后,我应该得到Seq(6,2,-4,7,9,10,8)

因为-4是第一个负数,这意味着它不会被删除,但其他负数会被删除。

您可以这样做

seq.foldLeft(false -> List.empty[Int]) {
  case ((true, ls), neg) if (neg < 0) =>
    true -> ls // after firstFound=true
  case ((false, ls), neg) if (num < 0) =>
    true -> (ls :+ neg)
  case ((firstFound, ls), positive) =>
    first -> (ls :+ positive)
}._2 // get just List from last state
seq.foldLeft(false->List.empty[Int]){
如果(负<0)=>
true->ls//firstFound之后=true
如果(num<0)=>
正确->(ls:+neg)
案例((首次发现,ls),阳性)=>
第一->(ls:+正)
}.\u 2//从上一个状态获取公正列表

span
让您接近:

scala> val vs = Seq(6, 2, -4, 7, 9, 10, -15, 8, -20)
vs: Seq[Int] = List(6, 2, -4, 7, 9, 10, -15, 8, -20)

scala> val (pos, rest) = vs span (_ >= 0)
pos: Seq[Int] = List(6, 2)
rest: Seq[Int] = List(-4, 7, 9, 10, -15, 8, -20)

scala> (pos :+ rest.head) ++ (rest.tail filter (_ >= 0))
res0: Seq[Int] = List(6, 2, -4, 7, 9, 10, 8)
编辑:


将列表拆分为包含非负数元素的前导位和剩余位(如果非空,则必须以负数开头)。把其余的负数去掉

def negativeNumbers(sequence: Iterable[Int]): Iterable[Int] = {
    val (before, after) = sequence.span(_>=0)

    if (after.isEmpty) before else before ++ Iterable(after.head) ++ after.tail.filter(_>=0)
   } 
val seq=seq(6,2,-4,7,9,10,-15,8,-20)
val neg=seq.filter{a=>ab>0 | | b==neg.headOption.getOrElse(-1)}
我的方法是使用scanLeft跟踪是否找到第一个负数,然后收集结果:

val s = Seq(6, 2, -4, 7, 9, 10, -15, 8, -20)
s.zip(s.scanLeft(true){
  (b,i) => b && i >= 0
}).collect{
  case (i,b) if b || i >= 0 => i
}

这是一个严肃的问题吗?只需将代码作为
def
的实现/主体进行尝试。顺便说一句,您不需要
return
语句。关于如何在我的函数中使用它,您有什么想法吗?def negativeEnumbers(序列:Iterable[Int]):Iterable[Int]={}假设至少有一个负数?(而且,
:+
并不是为Iterable定义的)“我对Scala还是个新手…”而给你的作业是为了帮助你超越这一点(也就是说,你真的想把答案放在盘子里,还是打算在这一过程中学习?@原型Paul I like your logic“类型不匹配;发现:Int(-1)required:Boolean“这是一个想法,但假设-4不会出现多次。不确定为什么您删除了示例输入和输出,包括这些输入和输出是一件好事。没有回复@TheArchetypalPaul的评论,我认为较早的版本更好,所以我回滚了。如果人们对某个问题的帮助做出了有益的评论,请回复他们和/或采取适当的行动。
val seq = Seq(6, 2, -4, 7, 9, 10, -15, 8, -20)
val neg = seq.filter{a => a<0}
seq.filter{ b => b>0 || b == neg.headOption.getOrElse(-1)}
val s = Seq(6, 2, -4, 7, 9, 10, -15, 8, -20)
s.zip(s.scanLeft(true){
  (b,i) => b && i >= 0
}).collect{
  case (i,b) if b || i >= 0 => i
}