Scala-迭代器

定义

迭代器不是一种集合,它是一种用于访问集合的方法。

需要通过集合对应的迭代器调用迭代器的方法来访问。

支持函数式编程风格,便于链式操作。

练习迭代器的使用:

object Test_迭代 {def main(args: Array[String]): Unit = {val list1 =List(1,2,3,4)//1. foreach 实现list1.foreach(println)//2.迭代器//2.1构建迭代器val it = list1.iterator//2.2依次取元素while (it.hasNext){println(it.next())}val set1 =Set("apple","banana")val it2 =set1.iterator //构建迭代器while (it2.hasNext){println(it2.next())}it2.map(a => s"I like $a").foreach(println)}
}
object Test_迭代 {def main(args: Array[String]): Unit = {val list1 =List(1,2,3,4)//duplicate:复制迭代器//得到一组,两个迭代器,它们有相同的数据,但是相互独立val it = List(3,4,5,6,7).iteratorval (it1,it2) = it.duplicateprintln(it1,it2)//用第一个迭代器 来计算平均值val dataList = it1.toList//把迭代器的数据放到列表中val avg = dataList.sum / dataList.sizeprintln("平均值:"+avg)//用第二个迭代器来选出大于平均值的元素it2.filter(x => x > avg).foreach(println)}
}

 take:从当前位置开始,取几个元素,得到新的迭代器

  drop:从当前位置开始,跳过指定数量的元素,得到新的迭代器

    //take:从当前位置开始,取几个元素,得到新的迭代器val it = List(1,2,3,4,5,6,7).iterator//drop:从当前位置开始,跳过指定数量的元素,得到新的迭代器val it2 = it.drop(3)//只输出3个val it1 = it2.take(3)while (it1.hasNext){println(it1.next())}

toList的作用:把迭代器中剩余的元素保存到一个List中

 //toList的作用:把迭代器中剩余的元素保存到一个List中val it = List(1,2,3,4,5,6,7).iteratorit.next()//移动一次it.next()//移动一次while (it.hasNext){println(it.next())}val li = it.toListprintln(li)

zip方法(拉链):把两个迭代器合成一下,得到新的迭代器,长度以短的为准

val nums = List(1,2,3).iteratorval words = List("one","two","three").iterator//zip:把两个迭代器合成一下,得到新的迭代器,长度以短的为准val it = nums.zip(words)while (it.hasNext){val p = it.next()//元组println(s"${p._1} ===== ${p._2}")}

【课后小答】

1.以下关于送代器next为法说法正确的是(C
A.它总是返回送代器中的第一个元条。
B.它返回送代器中的下一个无善,并将送代器位置向前移动一位,如果没有下一个元素会返回None。
C.它返回送代器中的下一个元素,并将送代器位置向前移动一位,如果没有下一个元素会抛出NoSuchElementException.
D.它可以返回送代器中的任意一个元素。

2.duplicate方法创建的法代器副本与原送化器(A
A.共享元素序列,修改典中一个会彩响另一个。
B.不共享元素序列,修改共一一个不会影响另一个。
C.共享元素序列,但修故热中一个不会影响另一个。
D.没有任何关系

3.对于ziP方法,当两个选代器台度不同时(B)
A.会自动补齐较短的送优器,使英长度与较长的送代器相同。
B.会在较短的送代器耗尽时停上zip操作。
C.会抛出异常。
D.会重复使用较短的送代器元素,直到与较长的送代器长度相同。

4.toList方法对迭代器的作用是(B)
A.将迭代器中的所有元素转换为一个列表,包括已经遍历过的元素。
B.将迭代器中的剩余元素转换为一个列表。
C.将列表转换为迭代器。
D.将选代器转换为一个不可变的集合。


5.使用drop方法创建的子送代器(B
A.包含原迭代器的所有元素。
B.从原迭代器的开头开始,跳过指定数量的元素后包含剩余的元素。
C.包含原选代器中指定数量的元素,从开头开始。
D.是原迭代器的一个副本,不跳过任何元素

【实训】

1.创建学生信息数据结构和初始数据。创建一个表示学生信息的类,case
sludenl包含姓名、年龄和成绩列表[数学,英语,语文7等属性。然后创建几个学生
对象,并将它们存储在一个列表中
2.创建迭代器并进行基础遍历。为学生列表创建选代器,使用选代器的hasNext
和nexL方法遍历学生信息,打印每个学生的姓名。
3.使用duplicate方法和筛选操作。利用duplicate方法创建送代器副本。在
原迭代器上根据年龄条件筛洗年龄>20岁的同学,在副本迭代器上根据语文成绩条件
筛选>80分的同学。
4.使用zip方法关联信息。创建一个新的列表用于存储每个学生的平均成绩(E
门课的平均成绩),再创建该列表的选代器。通过ZID方法将学生法代器和平均成绩
迭代器组合,然后打印每个学生的姓名和平均成绩。
5.打印前三名的同学信息。
6.打印从第4名开始的后3位同学的信息。
7.重新创建学生列表的迭代器,用于统计所有学生的所有成绩的总和,并打印结

8.再次使用该迭代器,筛选出成绩列表中有至少一个特定分数以上的学生信息,
并打印他们的姓名和年龄。

// 1. 创建学生信息数据结构和初始数据
case class Student(name: String, age: Int, scores: List[Double])object StudentOperations {def main(args: Array[String]) {// 创建几个学生对象,并将它们存储在一个列表中val student1 = Student("张三", 18, List(85.0, 90.0, 80.0))val student2 = Student("李四", 22, List(75.0, 85.0, 90.0))val student3 = Student("王五", 20, List(90.0, 80.0, 75.0))val student4 = Student("赵六", 25, List(88.0, 92.0, 85.0))val studentList = List(student1, student2, student3, student4)// 2. 创建迭代器并进行基础遍历val studentIterator = studentList.iteratorwhile (studentIterator.hasNext) {val student = studentIterator.next()println(s"学生姓名: ${student.name}")}// 3. 使用duplicate方法和筛选操作val (originalIterator, duplicateIterator) = studentList.iterator.duplicateval filteredByAge = originalIterator.filter(_.age > 20)val filteredByChineseScore = duplicateIterator.filter(_.scores(2) > 80)println("年龄大于20岁的同学:")filteredByAge.foreach(student => println(student.name))println("语文成绩大于80分的同学:")filteredByChineseScore.foreach(student => println(student.name))// 4. 使用zip方法关联信息val averageScoresList = studentList.map(student => student.scores.sum / student.scores.length)val averageScoresIterator = averageScoresList.iteratorval zippedIterator = studentList.iterator.zip(averageScoresIterator)println("学生姓名和平均成绩:")zippedIterator.foreach { case (student, averageScore) =>println(s"${student.name} 的平均成绩: $averageScore")}// 5. 打印前三名的同学信息println("前三名同学信息:")studentList.take(3).foreach(println)// 6. 打印从第4名开始的后3位同学的信息println("从第4名开始的后3位同学信息:")studentList.drop(3).take(3).foreach(println)// 7. 重新创建学生列表的迭代器,用于统计所有学生的所有成绩的总和,并打印结果val allScoresIterator = studentList.iteratorvar totalScore = 0.0while (allScoresIterator.hasNext) {val student = allScoresIterator.next()totalScore += student.scores.sum}println(s"所有学生的所有成绩总和: $totalScore")// 8. 再次使用该迭代器,筛选出成绩列表中有至少一个特定分数以上的学生信息,并打印他们的姓名和年龄val specificScore = 85.0val filteredBySpecificScore = studentList.iterator.filter(student => student.scores.exists(_ > specificScore))println(s"成绩中有至少一个大于 $specificScore 分的同学信息:")filteredBySpecificScore.foreach(student => println(s"姓名: ${student.name}, 年龄: ${student.age}"))}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14819.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

unity3d————协程原理讲解

1.协程的本质 协程可以分成两部分1.协程函数本体 2.协程调度器 协程本体就是一个能够中间暂停返回的函数 协程调度器是Unity内部实现的,会在对应的时机帮助我们继续执行协程函数 Unity只实现了协程调度部分协程的本体本质上就是一个 C#的迭代器方法 2.协程本体是…

社区物资交易互助平台(程序+数据库+报告)

基于Spring Boot框架实现的社区物资交易互助平台,系统包含两种角色:管理员、用户,系统分为前台和后台两大模块,主要功能如下。 【前台】: - 首页:展示平台的概览信息和热门内容。 - 论坛:提供一个交流讨论…

学者观察 | 元计算、人工智能和Web 3.0——山东大学教授成秀珍

导语 成秀珍教授提出元计算是在开放的零信任环境下整合算力资源打通数据壁垒构建自进化智能的新质生产力技术,是一种新计算范式;区块链是Web3.0的核心技术之一,有助于保障开放零信任环境下,用户、设备和服务间去中心化数据流通的…

JMeter中添加请求头

在JMeter中添加请求头的步骤如下: 1.打开HTTP信息头管理器 : 首先,你需要进入JMeter的HTTP请求组件。这可以通过在HTTP请求测试元素上右键点击,然后选择“添加 > 配置元件 > HTTP信息头管理器”来完成。 2.添加新的请求头…

ROS Action

在 ROS 中,Action 是一种支持长时间异步任务的通信机制。与 Service 不同,Action 允许客户端发起一个请求,并在任务执行的过程中不断接收反馈,直到任务完成。这种机制非常适用于可能需要较长时间来完成的任务,比如机器…

江苏省考公务员报名照片要求及处理方法

随着江苏省公务员考试的临近,许多考生已经开始准备报名所需的各项材料,其中照片的准备尤为重要。本文将详细介绍江苏省考公务员报名照片的具体要求以及如何使用手机拍照并处理照片,确保您的报名过程顺利进行。 一、江苏省公务员招录考试报名照…

计算机网络学习笔记-3.2介质访问控制

文章目录 介质访问控制静态划分信道 动态分配信道轮询访问介质访问控制随机访问介质访问控制ALOHA协议简介ALOHA协议的工作原理 介质访问控制 介质访问控制(MAC,Medium Access Control),质访问控制的目的是确保多个设备能够高效、…

软件测试-巨量测试开发

软件测试-巨量测试 编辑时间:2024/11/13 软件测试基础知识 软件测试定义和测试分类 软件是计算机程序、程序所用的数据以及有关文档资料的集合。 软件测试分类 按测试执行阶段划分 单元测试、集成测试、系统测试、验收测试 是否运行程序划分 动态测试、静态测试…

pycharm中from[本地包]import文件/模块出现问题(最最最全方法!)

1.通过PYTHONPATH的方法在此处将路径添加上,能够让IDE访问得到。 2.通过选中目标文件所在的文件的文件夹单击右键,如下图所示可以看到下方的mark directory as选项中存在 存在excluded,选择此项可解决问题,如果仍有问题可以尝试其…

【日志】Unity——Roll-A-Ball(二)

2024.11.13 【Unity】 3.搭建游戏场景 4.设置可拾取物品 4.1设置可拾取方块 给予一定的变化和颜色 编写方块旋转脚本Rotator.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class Rotator : MonoBehaviour {// Update is cal…

机器学习(1)线性回归

前言   线性回归算法是机器学习深度学习入门的必学的算法,其算法原理虽然简单,但是却蕴含着机器学习中的一些重要的基本思想。许多功能更为强大的非线性模型可在线性模型的基础上通过引入层级结构或高维映射而得。同时机器学习深度学习的核心思想就是优…

CSS:导航栏三角箭头

用CSS实现导航流程图的样式。可根据自己的需求进行修改,代码精略的写了一下。 注:场景一和场景二在分辨率比较低的情况下会有一个1px的缝隙不太优雅,自行处理。有个方法是直接在每个外面包一个DIV,用动态样式设置底色。 场景一、…

Redis设计与实现 学习笔记 第十七章 集群

Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding,水平切分)来进行数据共享,并提供复制和故障转移功能。 17.1 节点 一个Redis集群通常由多个节点(node)组成,在刚开…

(11)(2.1.7) FETtec OneWire ESCs(二)

文章目录 前言 3 组态 4 可选功能 5 SITL模拟 6 故障排除 前言 !Note 此功能在固件版本4.1.1及更高版本上可用。 3 组态 FTW掩码 SERVO_FTW_MASK 参数选择将哪些伺服输出(如果有的话)路由到 FETtec ESC。更改此参数后需要重新启动。…

Python Bokeh 数据可视化教程

Python Bokeh 数据可视化教程 引言 在数据科学和分析的过程中,数据可视化是一个至关重要的环节。它不仅能帮助我们更好地理解数据,还能在报告和展示中提升数据的可读性和吸引力。Python 作为数据科学的主要工具之一,提供了多种数据可视化库…

(免费领源码)java#SSM#mysql高校就业数据可视化管理系统的设计与实现81461-计算机毕设 原创

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对高校就业管理等问题,对高校就业…

wordcloud库基本介绍

文章目录 wordcloud库概述wordcloud库的安装 wordcloud库使用说明配置对象参数 wordcloud应用实例实例: 政府工作报告词云 wordcloud库概述 wordcloud是优秀的词云展示第三方库 词云以词语为基本单位,更加直观和艺术地展示文本 wordcloud库的安装 (cmd命令行) pip install …

替换OpenTSDB和HBase,宝武集团使用IoTDB助力钢铁设备智能运维

时序数据库 IoTDB 应用于宝武集团全基地钢铁时序数据管理,激活数据资产,赋能大型设备智能运维。 1. 背景概述 宝武装备智能科技有限公司(以下简称:宝武智维)是中国宝武设备智能运维专业化平台公司,30 余年始…

面试_ABtest原理简介

01 什么是ABtest ABtest来源于假设检验,现有两个随机均匀的有样本组A、B,对其中一个组A做出某种改动,实验结束后分析两组用户行为数据,通过显著性检验,判断这个改动对于我们所关注的核心指标是否有显著的影响&#xf…

Anolis8.2系统中搭建python环境

文章目录 安装依赖项依赖项介绍 下载python源码包安装python源码包 安装依赖项 [rootPython ~]# dnf install -y gcc make zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel xz-devel libffi-devel uuid-devel libnsl2-d…