热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在换行到头部时跳过一些值来查找项目的索引

我有一个布尔值列表valstacksList(True,True,False,True,False)

我有一个布尔值列表

val stacks = List(True,True,False,False)

我需要一个具有索引的函数,并返回下一个不为false的索引,并在达到长度后返回0。

def nextInvolvedAfter(after: Int): Int = ???

例如:

nextInvolvedAfter(0) // 1
nextInvolvedAfter(1) // 3
nextInvolvedAfter(2) // 3
nextInvolvedAfter(3) // 0

我正在考虑遍历这样的列表:

stacks.drop(after + 1) ++ stacks indexWhere(_)


恕我直言,这种问题非常适合使用 tail-recursive 算法解决。

def nextInvolvedAfter(data: List[Boolean])(after: Int): Int = {
@annotation.tailrec
def loop(remaining: List[Boolean],currentIdx: Int): Int =
remaining match {
case true :: _ if (currentIdx > after) => currentIdx
case _ :: xs => loop(remaining = xs,currentIdx + 1)
case Nil => nextInvolvedAfter(data)(after = -1) // Start again from the begining.
}
loop(remaining = data,currentIdx = 0)
}

但是,如果您想要使用内置方法的解决方案,请检查以下内容:

def nextInvolvedAfter(data: List[Boolean])(after: Int): Int =
data.iterator.zipWithIndex.collectFirst {
case (true,idx) if (idx > after) => idx
}.getOrElse(nextInvolvedAfter(data)(after = -1)) // Start again from the begining.

都可以像这样测试:

val test = nextInvolvedAfter(List(true,true,false,false)) _
// test: Int => Int = $$Lambda$938/1778422985@51a6cc2a
test(0)
// res: Int = 1
test(1)
// res: Int = 3
test(2)
// res: Int = 3
test(3)
// res: Int = 0
test(4)
// res: Int = 0

但是,请注意,如果所有值均为false,它将以 StackOverflow 异常结束,因此请谨慎使用。
或者,您可以添加自定义逻辑以从头开始进行第二次迭代后终止。

,

这似乎有效:

(stacks.zipWithIndex.drop(after + 1) ++ stacks.zipWithIndex).find(_._1).get._2

,

我认为我们可以简单地遍历索引。 getOrElse可用于进行循环检查:

def nextInvolvedAfter(as : List[Boolean],after : Int) : Int =
as.indices.find(i => i > after && as(i))
.getOrElse(
as.indices.find(i => as(i)).getOrElse(-1)
)

通过尝试仅遍历列表的相关部分可以对此进行一些改进,您可以直接使用scala.collection.immutable.Range而不是indices

def nextInvolvedAfter(as : Vector[Boolean],after : Int) : Int =
after + 1 until as.size find as getOrElse
0 to after find as getOrElse -1

还请注意,如注释中所述,使用索引遍历列表是无效的。

要注意的另一件事是,在此问题的所有解决方案(包括接受的解决方案)中,如果给定索引大于列表大小,则该函数将仅返回遇到的第一个 true 值名单。进行简单的条件检查以确保索引在范围内可以解决此问题。


推荐阅读
author-avatar
南方的狼1975
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有