遍历集合的方法

1.用foreach循环遍历一个集合

foreach接收一个函数作为参数。定义的函数应该接收一个元素作为输入参数,然后不要返回任何的东西。输入的参数的类型应该匹配集合中的类型。随着foreach的执行,它每次都会把一个元素传给你的函数,直到集合中最后一个元素。

foreach常用的就是输出信息:

scala> val x = Vector(1,2,3)
x: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3) scala> x.foreach((i:Int) => println(i))
1
2
3

对于表达式,还有其他写法:

x.foreach(i => println(i))

x.foreach(println(_))

x.foreach(println) 

对于最后一种表达式,情况是一个只有一条语句组成并且接受一个参数的函数可以简写成这种形式。

2.用for循环遍历一个集合

可以用for循环遍历任意一种Traversable的类型。

scala> val fruits = Traversable("apple","orange","banana")
fruits: Traversable[String] = List(apple, orange, banana) scala> for(i <- fruits) println(i)
apple
orange
banana

如果算法很长,可以在for循环的代码块里执行。

下面展示了for循环里使用计数器的几种方式:

scala> val fruits = Array("apple","banana","orange")
fruits: Array[String] = Array(apple, banana, orange) scala> for(i <- 0 until fruits.size) println(s"$i is ${fruits(i)}")
0 is apple
1 is banana
2 is orange
scala> val fruits = Array("apple","banana","orange")
fruits: Array[String] = Array(apple, banana, orange) scala> for((elem,count) <- fruits.zipWithIndex){
| println(s"$count is $elem")
| }
0 is apple
1 is banana
2 is orange
scala> val fruits = Array("apple","banana","orange")
fruits: Array[String] = Array(apple, banana, orange) scala> for((elem,count) <- fruits.zip(Stream from 1)){
| println(s"$count is $elem")
| }
1 is apple
2 is banana
3 is orange

3.用zipWithIndex创建循环计数器

(1)以foreach的形式遍历集合

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

 另外的一种表示方法:

scala> val days = Array("Sunday","Monday","Tusday","Wednsday","Thursday","Friday","Saturday")
days: Array[String] = Array(Sunday, Monday, Tusday, Wednsday, Thursday, Friday,Saturday) scala> days.zipWithIndex.foreach{ d=>
| println(s"${d._2+1} is ${d._1}")
| }
1 is Sunday
2 is Monday
3 is Tusday
4 is Wednsday
5 is Thursday
6 is Friday
7 is Saturday

(2) 以for的形式循环遍历

scala> val days = Array("Sunday","Monday","Tusday","Wednsday","Thursday","Friday","Saturday")
days: Array[String] = Array(Sunday, Monday, Tusday, Wednsday, Thursday, Friday,Saturday) scala> for ((day,count) <- days.zipWithIndex){
| println(s"${count+1} is $day")
| }
1 is Sunday
2 is Monday
3 is Tusday
4 is Wednsday
5 is Thursday
6 is Friday
7 is Saturday

4.用zip创建循环计数器

在zip中使用Stream是一种生存计数器的方法。

scala> val days = Array("Sunday","Monday","Tusday","Wednsday","Thursday","Friday","Saturday")
days: Array[String] = Array(Sunday, Monday, Tusday, Wednsday, Thursday, Friday,Saturday) scala> for ((day,count) <- days.zip(Stream from 1)){
| println(s"$count is $day")
| }
1 is Sunday
2 is Monday
3 is Tusday
4 is Wednsday
5 is Thursday
6 is Friday
7 is Saturday

5.range循环计数器

如果只是需要重复做某事多次,可以用range。

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

6.用reduce方法遍历集合

使用reduceLeft和reduceRight方法来遍历序列中的元素,把相邻的元素传给你的函数成成一个新的结果,之后和序列的下一个元素比较在生成新的结果。

reduceLeft方法是从左到右遍历一个序列,在算法中首先会对前两个元素进行比较,然后返回一个结果。该结果会与第三个元素进行比较,比较之后在产生一个新结果,接着在于第四个元素比较,以此类推。

scala> val a = Array(12,3,4,5,67)
a: Array[Int] = Array(12, 3, 4, 5, 67) scala> a.reduceLeft(_ + _)
res4: Int = 91 scala> a.reduceLeft(_ min _)
res5: Int = 3 scala> a.reduceLeft(_ max _)
res6: Int = 67

这里面的两个下划线,它们代表传给函数的两个参数。

reduceRight与reduceLeft同理的。

7.用fold方法遍历集合

foldLeft方法如同reduceLeft,它会设置一个种子值用于第一个元素。foldLeft接收两个参数列表。第一个列表有一个字段,种子值。第二个列表是要运行的代码块。

scala> val a = Array(12,3,4,5,67)
a: Array[Int] = Array(12, 3, 4, 5, 67) scala> a.reduceLeft(_ + _)
res8: Int = 91 scala> a.foldLeft(20)(_ + _)
res9: Int = 111

我们来看一下foldLeft和foldRight的执行过程:  

下面的/:是foldLeft的简化版。

scala> ((1 to 4).foldLeft(5))((i,sum) => i-sum)
res25: Int = -5 scala> (1 to 4).foldLeft(5)(_-_)
res8: Int = -5 scala> (5/:(1 to 4))(_-_)
res9: Int = -5

foldLeft的执行过程:5-1-2-3-4=-5

下面的:\是foldRight的简化版。

scala> ((1 to 4).foldRight(5))((i,sum) => i-sum)
res22: Int = 3 scala> (1 to 4).foldRight(5)(_-_)
res14: Int = 3 scala> ((1 to 4):\5)(_-_)
res15: Int = 3

foldRight的执行过程:1-(2-(3-(4-(5-0))))=3

scala的多种集合的使用(3)之遍历集合的方法的更多相关文章

  1. 集合-新特性foreach循环遍历集合或项目

    1.增强for循环对集合的遍历 点击查看代码 @Test //集合遍历 public void test3(){ Collection coll = new ArrayList(); coll.add ...

  2. Java基础知识强化之集合框架笔记62:Map集合之HashMap嵌套HashMap

    1. HashMap嵌套HashMap  传智播客          jc    基础班                      陈玉楼  20                      高跃   ...

  3. Java基础知识强化之集合框架笔记14:List集合存储字符串并遍历

    1. List集合存储学生对象并遍历: 需求:存储字符串并遍历 分析: (1)创建集合对象 (2)创建字符串对象 (3)添加字符串对象到集合中 (4)遍历集合 2. 代码示例: package cn. ...

  4. Java基础知识强化之集合框架笔记12:Collection集合存储字符串并遍历

    1.  Collection集合存储字符串并遍历 分析: (1)创建集合对象 (2)创建字符串对象 (3)把字符串对象添加到集合中 (4)遍历集合 2. 代码示例: package cn.itcast ...

  5. Java遍历集合的几种方法分析(实现原理、算法性能、适用场合)

    概述 Java语言中,提供了一套数据集合框架,其中定义了一些诸如List.Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList ...

  6. 迭代器:遍历集合元素的操作. iterator()

    package seday11; import java.util.ArrayList;import java.util.Collection;import java.util.Iterator; / ...

  7. scala的多种集合的使用(6)之映射Map的操作方法

    1.创建映射 1)创建不可变的映射 scala> val status = Map(1 -> "a",2 -> "b") status: sc ...

  8. scala的多种集合的使用(2)之集合常用方法

    一.常用的集合方法 1.可遍历集合的常用方法 下表列出了Traverable在所有集合常用的方法.接下来的符号: c代表一个集合 f代表一个函数 p代表一个谓词 n代表一个数字 op代表一个简单的操作 ...

  9. scala的多种集合的使用(1)之集合层级结构与分类

    一.在使用scala集合时有几个概念必须知道: 1.谓词是什么? 谓词就是一个方法,一个函数或者一个匿名函数,接受一个或多个函数,返回一个Boolean值. 例如:下面方法返回true或者false, ...

随机推荐

  1. 怎么隐藏 iOS Safari 打开网页时的地址栏和工具栏探索

    先来看一张截图 红色框处就是用手机浏览器打开页面时,自动显示出来的头部地址栏和底部工具栏 如果现在有一个需求,用手机浏览器打开页面时,把地址栏和工具栏隐藏,该怎么办呢? 起初我在度娘找到了好几篇博客都 ...

  2. jdk安装 java环境配置

    登录http://www.oracle.com,下载JDK(J2SE) JDK 1.0,1.1,1.2,1.3,1.4 1.5 (JDK5.0) à支持注解.支持泛型 1.6(JDK6.0) à Se ...

  3. ASP.NET Core Middleware 抽丝剥茧

    一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道pipeline中用于处理请求和操作响应的组件. 每个组件是pipeline 中的一环. 自行决定是否将请求传递给下一 ...

  4. Capacitor 新一代混合应用“神器” 会代替Cordova吗??

    1.介绍or畅想 Capacitor是由ionic团队最新开发维护的一个跨平台的应用程序容器,可以轻松构建在iOS,Android,Electron 和 Web 上本机运行的Web应用程序.我们称这些 ...

  5. 浅谈基于Intellij IDEA Maven的配置与使用

    在java开发中,引入jar包的方式从种类上划分,可分为自动导入和手动导入,然而,手动导入繁琐,不是很适合当前开发模式,手动导入也被自动导入所取代. 当前,Maven和Gradle是比较主流的自动导入 ...

  6. 使用Atlas进行元数据管理之Glossary(术语)

    背景:笔者和团队的小伙伴近期在进行数据治理/元数据管理方向的探索, 在接下来的系列文章中, 会陆续与读者们进行分享在此过程中踩过的坑和收获. 元数据管理系列文章: [0] - 使用Atlas进行元数据 ...

  7. TensorRT学习总结

    TensorRT是什么 建议先看看这篇https://zhuanlan.zhihu.com/p/35657027 深度学习 训练 部署 平常自学深度学习的时候关注的更多是训练的部分,即得到一个模型.而 ...

  8. Convert.ToInt32()和int.Parse()区别

    Convert.ToInt32()和int.Parse()都可以数据转换个int类型,区别在于: 1. Convert.ToInt32()将object类类型转换成int类型,例如:Convert.T ...

  9. 关于C# 中的布尔运算符 "&" "|” 与 其类似的条件布尔运算符 "&&" "||" 区别说明。

    运算符使用说明如下:  分隔符 ———————————————————————————— 分隔符 ———————————————————————————— 上述两个运算符的结果与&和 | 完全 ...

  10. C#/VB.NET设置Excel表格背景色

    在查看很多有复杂的数据的表格时,为了能够快速地找到所需要的数据组时,往往需要对该数据组进行分类,一个简单快速的方法就是对数据组所在的单元格填充背景颜色,这样就使得我们在阅读文件时能够直观的看到数据分类 ...