问题:
你要遍历一个有序集合,同时你又想访问一个循环计数器,但最重要的是你真的不需要手动创建这个计数器。
解决方案:
    使用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")}
 is Sunday
 is Monday
 is Tuesday
 is Wednesday
 is Thursday
 is Friday
 is Saturday

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

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

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

scala> for((day,count) <- days.zip(Stream from )) {
     |   println(s"$count is $day")
     | }
 is Sunday
 is Monday
 is Tuesday
 is Wednesday
 is Thursday
 is Friday
 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,), (b,), (c,))

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

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

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

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

scala> days.zipWithIndex.foreach(d => println(s"${d._2} is ${d._1}"))
 is Sunday
 is Monday
 is Tuesday
 is Wednesday
 is Thursday
 is Friday
 is Saturday

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

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

Scala中 zip或者zipWithIndex的用法的更多相关文章

  1. Scala中Zip相关的函数

    在Scala中存在好几个Zip相关的函数,比如zip,zipAll,zipped 以及zipWithIndex等等.我们在代码中也经常看到这样的函数,这篇文章主要介绍一下这些函数的区别以及使用. 1. ...

  2. 07 Python中zip(),map(),filter(),reduce()用法

    一. zip() zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表. 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 ...

  3. scala中分组的算子的用法

    val rdd= sc.parallelize(List(("tom",1),("jerry",3),("kitty",2),(" ...

  4. 第85讲:Scala中For表达式的强大表现力实战

    今天来学一下scala中的For表达式的用法. package scala.learn case class Persons(name:String,isMale:Boolean,children:P ...

  5. Scala中使用implict 扩展现有类的方法

    Scala中implict的一种用法就是扩展现有类的方法,有点类似于.Net中的扩展方法(MS对扩展方法的介绍:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改 ...

  6. Scala进阶之路-Scala中的枚举用法案例展示

    Scala进阶之路-Scala中的枚举用法案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的枚举值和Java中的枚举值有点差别,不过使用起来也都差大同小异,我这 ...

  7. Scala中_(下划线)的常见用法

    Scala中_(下划线)的常见用法 地址:https://www.jianshu.com/p/0497583ec538

  8. Python中zip()与zip(*)的用法

    目录 Python中zip()与zip(*)的用法 zip() 知识点来自leetcode最长公共前缀 Python中zip()与zip(*)的用法 可以看成是zip()为压缩,zip(*)是解压 z ...

  9. Scala中apply的用法

    Scala中的 apply 方法有着不同的含义, 对于函数来说该方法意味着调用function本身, 以下说明摘自Programming in Scala, 3rd Edition Every fun ...

随机推荐

  1. Redis数据结构之sds基本操作函数

    本文及后续文章,Redis版本均是v3.2.8 本篇文章讲解sds基本操作函数,我们从源码角度来进一步理解. 一.sds创建函数和销毁 sds创建函数 /* Create a new sds stri ...

  2. 五一劳动节,讲讲NEO智能合约的调试

    之前我们说过NEO智能合约的调试问题,过去了一段时间,有很多东西都发生了比较大的变化.让我们重新再来探讨一下这个话题. 先说日期,2018年4月27日,马上迎来劳动节.   以后可能还会再次谈论这个话 ...

  3. Selenium + Python +CSV

    绪论 首先写这个文章的时候仅仅花了2个晚上(我是菜鸟所以很慢),自己之前略懂selenium,但是不是很懂csv,这次相当于练手了. 第一章 环境介绍 具体实验环境 系统 Windows10教育版 1 ...

  4. Android项目中的config.xml文件 “config.xml”

    Android应用程序需要保存一些配置时,可以将这些配置项放置到values/config.xml文件中. 实例分析: <?xml version="1.0" encodin ...

  5. 容器加載Web工程的Web.xml文件介紹

    转 容器加載Web工程的Web.xml文件介紹 [-] 这篇文章主要是综合网上关于webxml的一些介绍希望对大家有所帮助也欢迎大家一起讨论 ---题记 一            Webxml详解 一 ...

  6. easyui commobox省市区县三级联动

    1.前端代码 <div class="col-6 f-group"> <label class="col-4 left_red"> 省名 ...

  7. pytorch简介

    诞生 1.2017年1月,Facebook人工智能研究院(FAIR)团队在GitHub上开源了pyTorch,并迅速占领GitHub热度榜榜首. 常见深度学习框架简介 Theano 1.Theano最 ...

  8. (52)Wangdao.com第七天_字面量/变量_标识符_数据类型_数据的存储

    JavaScript 字面量 和 变量 字面量:就是那些不可变的值,如1,2,100,2000,Infinity,NaN 变量: 变量,代表的当前随机分配的内存地址. 变量的值,是可变的,可以用来保存 ...

  9. C#获取变更过的DataTable记录的实现方法

    本文实例讲述了C#获取变更过的DataTable记录的实现方法,是一个非常实用的功能!具体实现方法如下: 首先DataTable可以看做是一个物理表的内存式存储,每一个DataRow都有一个属性叫做R ...

  10. archlinux下安装acroread打开pdf

    虽说acroread是个好东西,但是在打开pdf几秒后总是自动退出呢 在其aur网页下找到了这么一解决办法: 打开终端输入 sudo unshare -n sudo -u ${USER} ACRO_A ...