你要遍历一个有序集合,同时你又想访问一个循环计数器,但最重要的是你真的不需要手动创建这个计数器。

解决方案:

使用zipWithIndex或者zip方法来自动地创建一个计数器,假设你有一个有序集合days,那么你可以使用zipWithIndex和counter来打印带有计数器的集合元素:

scala> val days = Array("Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday")
days: Array[String] = Array(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)scala> days.zipWithIndex.foreach{case(day,count) => println(s"$count is $day")}
0 is Sunday
1 is Monday
2 is Tuesday
3 is Wednesday
4 is Thursday
5 is Friday
6 is Saturday

同样,你可以使用for循环来打印计数器和集合元素

scala> for((day,count) <- days.zipWithIndex) {|   println(s"$count is $day")| }
0 is Sunday
1 is Monday
2 is Tuesday
3 is Wednesday
4 is Thursday
5 is Friday
6 is Saturday

zipWithIndex的计数器都是从0开始,如果你想指定开始的值,那么你可以使用zip Stream:

scala> for((day,count) <- days.zip(Stream from 1)) {|   println(s"$count is $day")| }
1 is Sunday
2 is Monday
3 is Tuesday
4 is Wednesday
5 is Thursday
6 is Friday
7 is Saturday

Discussion

当有序集合调用zipWithIndex的时候,它会返回一个有序的二元组集合:

scala> val list = List("a", "b", "c")
list: List[String] = List(a, b, c)scala> list.zipWithIndex
res3: List[(String, Int)] = List((a,0), (b,1), (c,2))

因为zipWithIndex是在一个已经存的有序集合上基础上建立一个新的有序集合,你可以在调用zipWithIndex之前调用view:

scala> val zwv = list.view.zipWithIndex
zwv: scala.collection.SeqView[(String, Int),Seq[_]] = SeqViewZ(...)

就像上面这个例子里面看到的,它创建了一个lazy view在原有的List基础上,所以这个元组集合并不被会被创建,直到它被调用的那一刻。正因有这种特性,我们推荐在调用zipWithIndex之前先调用view方法。

zip和zipWithIndex方法都返回一个有序二元祖集合。因此,你的foreach方法也可以写成下面这样,虽然这比起解决方案中的方法,可读性略差。

scala> days.zipWithIndex.foreach(d => println(s"${d._2} is ${d._1}"))
0 is Sunday
1 is Monday
2 is Tuesday
3 is Wednesday
4 is Thursday
5 is Friday
6 is Saturday

在之前的例子中我们曾经见过,可以通过一个for循环加range来创建这个计数器:

scala> val fruits = Array("apple", "banana", "orange")
fruits: Array[String] = Array(apple, banana, orange)scala> for (i <- 0 until fruits.size) println(s"element $i is ${fruits(i)}")
element 0 is apple
element 1 is banana
element 2 is orange

Scala中zip或者zipWithIndex的计数器用法相关推荐

  1. Scala中zip或者zipWithIndex用法

    你要遍历一个有序集合,同时你又想访问一个循环计数器. 解决方案: 使用zipWithIndex或者zip方法来自动地创建一个计数器,假设你有一个有序集合days,那么你可以使用zipWithIndex ...

  2. scala中zip拉链的操作

    package bms_entity.baseinfoobject zipOps {def main(args: Array[String]): Unit = {val province = Arra ...

  3. zip在python中的用法_Python中zip()函数用法实例教程

    本文实例讲述了Python中zip()函数的定义及用法,相信对于Python初学者有一定的借鉴价值.详情如下: 一.定义: zip([iterable, ...])zip()是Python的一个内建函 ...

  4. map写法 scala语言_(转)scala中map与flatMap浅析

    在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合.由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好 ...

  5. python中zip什么意思_浅谈Python中的zip()与*zip()函数详解 python的zip函数加上一个*号,是什么含义...

    python 当中的zip( )函数到底是干嘛的?你越来越善解人意,就没人在意你的委屈和脾气. zip([1,2,3],['a','b','c']) 结果是 [(1, 'a'), (2, 'b'), ...

  6. Scala中TypeTags和Manifests的用法

    Scala运行在JVM上,在JVM上有一种机制叫做类型擦除(type eraser).类型擦除是说:在语言的编译阶段程序中所携带的泛型信息都会被擦除,最终生成的class文件中是不包含类型信息的.所以 ...

  7. scala中sorted,sortby,sortwith的用法(转)

    scala中sorted,sortWith,sortBy用法详解 2017年07月23日 23:07:51 bitcarmanlee 阅读数:9249 版权声明:本文为博主原创文章,未经博主允许不得转 ...

  8. Python中zip()、zip(*zipped)、*zip()的用法及区别

    Python中zip().zip(*zipped).*zip()的用法及区别

  9. python中zip()函数的用法_Python zip()函数用法实例分析

    本文实例讲述了python zip()函数用法.分享给大家供大家参考,具体如下: 这里介绍python中zip()函数的使用: >>> help(zip) Help on built ...

最新文章

  1. RDKit | 可视化官能团, 分子聚类, 相似图, 化合物高亮和骨架网络
  2. 不用写代码就能做高端科学计算,Mathematica推出“人话”版软件
  3. 【错误记录】发布 Flutter 插件包报错 ( It‘s strongly recommended to include a “homepage“ or “repository“ field )
  4. unity vr 交互_基于手动的VR / MR交互,用于删除实体
  5. 前端学习(3040):vue+element今日头条管理-上午回顾
  6. c中session的用法
  7. 【操作系统】实验 设计一个按优先权调度算法实现处理器调度的程序
  8. simpana oracle,华为认证云运维专家(HCIE-CDO)
  9. Java中HashMap原理
  10. 生成特定区间的随机数
  11. 去掉win7快捷方式箭头及修复锁定到任务栏失效
  12. 3D环绕音乐单页网站源码
  13. 宏正自动科技发表新款8/16端口双滑轨LCD KVM多电脑切换器
  14. 软1901cyl对c语言的认识
  15. winscp 同步_使用WinSCP进行简单代码文件同步
  16. Win10如何用微软账户自动登录电脑
  17. win7 64位 system32和syswow64文件夹
  18. rabbitMQ guest账号登录总是提示失败
  19. ANDROID 系统下载
  20. 游戏美术设计怎么入门?场景建模该如何学习?

热门文章

  1. 30行代码AC_HDU-5933 ArcSoft‘s Office Rearrangement(模拟+题解报告)
  2. 26行代码AC_试题 历届试题 日期问题 | 第八届蓝桥杯B组第七题
  3. Docker的四种网络模式和相关网络命令等操作
  4. java gc 可以对方法区进行回收_浅谈 Java 之 GC
  5. spring boot plugin_spring-boot-starter-parent 与 spring-boot-dependencies
  6. js根据应纳税所得额计算税金
  7. 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表
  8. openstack租户管理_openstack 租户、用户管理
  9. python快速入门期末版_史上最全Python快速入门教程,满满都是干货
  10. pythontdd测试命名_荐Pytest之测试命名规则