热门标签 | 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 值名单。进行简单的条件检查以确保索引在范围内可以解决此问题。


推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
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社区 版权所有