码迷,mamicode.com
首页 > 编程语言 > 详细

移除数组中第一个负数后的所有负数

时间:2017-09-14 23:57:59      阅读:367      评论:0      收藏:0      [点我收藏+]

标签:scala   移除数组中第一个负数后的所有负数   

scala> val a = ArrayBuffer[Int](1, 2,3, 5, -1, 2, -3, -5)
a: scala.collection.mutable.ArrayBuffer[Int]= ArrayBuffer(1, 2, 3, 5, -1, 2, -3
, -5)
 
scala> :paste
// Entering paste mode (ctrl-D tofinish)
 
var foundFirstNegative = false
val keepIndexes = for (i <- 0 untila.length if !foundFirstNegative || a(i) > 0) # 说明1
yield {
if (a(i) < 0) foundFirstNegative =true; i # 说明2
}
for (i <- 0 until keepIndexes.length)a(i) = a(keepIndexes(i)) # 说明3
a.trimEnd(a.length - keepIndexes.length)# 说明4
 
// Exiting paste mode, now interpreting.
 
foundFirstNegative: Boolean = true
keepIndexes:scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 2, 3, 4,
5)
scala> a
res4:scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 5, -1, 2)

算法说明:避免传统多次移动数组,多次remove,上述代码设计优点在于统一找出不满足条件的元素index,然后统一删除这些元素。

说明1:第一个负数和所有正数都会通过if守卫;

说明2:第一个负数通过if守卫,进入说明2代码,将foundFirstNegative置为true,后续的负数则通不过if守卫部分,且iif是独立的,并未使用块包围;

说明3:将a中前keepIndexes.length个元素置为对应的整数和第一个负数;

说明4:删掉akeepIndexes.length – 1位置后面的元素,剩下的即为所求元素。


本文出自 “90SirDB” 博客,请务必保留此出处http://90sirdb.blog.51cto.com/8713279/1965431

移除数组中第一个负数后的所有负数

标签:scala   移除数组中第一个负数后的所有负数   

原文地址:http://90sirdb.blog.51cto.com/8713279/1965431

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!