Scala---集合(数组,Map,元组(Tuple),Zip拉链)详解

scala的集合分为了两类,一类是可变的集合(集合可以执行增删改查操作),另一类是不可变集合(集合元素在初始化的时候确定,后续只能进行查,有的可以进行修改,有的不可以)。二者可能名称一样,但是在不同的包下面,对应的包为:scala.collection.mutable和scala.collection.immutable。scala默认使用的集合,或者默认导入的包是immutable。(说明:这里提到的可变或者不可变,指的是容器内部的内容 ,以及容器的长度可变或者不可变。)

一、数组

1、不可变数组Array
	//第一种方式val array = new Array[Int](5)//数字就是数组的个数//赋值array(1)=10println(array.toBuffer)//ArrayBuffer(0, 10, 0, 0, 0)//删除//调用drop,原数组保持不变,返回一个新的数组//drop从左往右删除n个val arr1 = array.drop(3)println(arr1.toBuffer) //ArrayBuffer(0, 0)println(array.toBuffer) //ArrayBuffer(0, 10, 0, 0, 0)//toBuffer方法可以将数组变成数组缓冲,在Scala中,Buffer是可变的,而Array是不可变的。这就是为什么我们需要使用toBuffer方法来转换Array为Buffer的原因val buffer=array.toBufferbuffer+=6println(buffer)//ArrayBuffer(0, 10, 0, 0, 0, 6)//查看数组长度println(array.length)println(array.size)//判断数组当中是否包含某个元素println(array.contains(10))//创建定长数组的第二种方法//调用apply方法进行创建val arr2 = Array[Int](5,2)//数字就是数组的元素println(arr2.toBuffer)//ArrayBuffer(5, 2)println(arr2(0))//5//第三种创建方式val array3 = Array(1,3,4,"rr")//数组的拼接val array4 = Array(1,3,4,"rr")//mkStringprintln(array4.mkString) //134rrprintln(array4.mkString("*")) //1*3*4*rrprintln(array4.mkString("[", "-", "]"))  //[1-3-4-rr]
2、可变数组ArrayBuffer
    //变长数组的创建//第一种方式val arr=new ArrayBuffer[Int]()//增加元素arr.append(1,2,3)println(arr)//ArrayBuffer(1, 2, 3)//在指定位置添加元素arr.insert(2,6,7)println(arr)//ArrayBuffer(1, 2, 6, 7, 3)//删除指定位置元素arr.remove(2)println(arr)//ArrayBuffer(1, 2, 7, 3)//drop删除n个元素后返回一个新数组val arr1 = arr.drop(4)println(arr1)//ArrayBuffer()//删除指定位置多个元素arr.remove(1,3)println(arr)//ArrayBuffer(1)//改元素arr(0)=2println(arr)//ArrayBuffer(2)//第二种创建方式val arr2 = ArrayBuffer[Int](1,2,3,4)println(arr2)//ArrayBuffer(1, 2, 3, 4)//第三种创建方式val arr3 = ArrayBuffer(1,"ff")arr3.append(2,"df")println(arr3)//ArrayBuffer(1, ff, 2, df)//判断数组当中是否包含某个元素println(arr3.contains(9))//查看数组的长度println(arr3.size)println(arr3.length)//拼接println(arr3.mkString)println(arr3.mkString("-"))println(arr3.mkString("[", "=", "]"))
3、定长数组与变长数组相互转换
	//定长数组转换成变长数组val arr = Array(1,2,3,4)val buffer = arr.toBufferprintln(buffer)//添加元素buffer.append(6,7,8)println(buffer)//ArrayBuffer(1, 2, 3, 4, 6, 7, 8)//删除元素buffer.remove(3)println(buffer)//ArrayBuffer(1, 2, 3, 6, 7, 8)//将变长数组转换成定长数组val arr1=buffer.toArray
4、数组遍历
	val arr=Array(1,2,3,4,5)//遍历第一种方式for(i<-arr){println(i)}//第二种遍历方式for(i<- 0 to arr.length-1){println(arr(i))}//第三种遍历方式for(i<- Range(0,arr.length)){println(arr(i))}//第四种for(i<- 0 until(arr.length)){println(arr(i))}//scala当中的遍历arr.foreach((x:Int)=>println(x))//进行简化arr.foreach(x=>println(x))arr.foreach(println(_))arr.foreach(println)}
5、数组的常用函数
val arr = Array(1,2,3,4,5,0,8,6,9,7)//求数组的和println(arr.sum)//45//求数组当中的最大值println(arr.max)//9//求数组中的最小值println(arr.min)//0//正序输出println(arr.sorted.toBuffer)//ArrayBuffer(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)//倒序输出println(arr.sorted.reverse.toBuffer)//ArrayBuffer(9, 8, 7, 6, 5, 4, 3, 2, 1, 0)//从左侧开始删除n个元素println(arr.drop(3).toBuffer)//ArrayBuffer(4, 5, 0, 8, 6, 9, 7)//从右侧开始删除n个元素println(arr.dropRight(4).toBuffer)//ArrayBuffer(1, 2, 3, 4, 5, 0)//从左侧开始删除到第一个不满足条件的元素后面就不再判断println(arr.dropWhile(x => x < 5).toBuffer)//ArrayBuffer(5, 0, 8, 6, 9, 7)//获取数组当中前n个元素println(arr.take(6).toBuffer)//ArrayBuffer(1, 2, 3, 4, 5, 0)//获取数组当中后n个元素println(arr.takeRight(4).toBuffer)//ArrayBuffer(8, 6, 9, 7)//从左往右获取元素,遇到第一个不符合条件的就断开println(arr.takeWhile(x => x < 5).toBuffer)//ArrayBuffer(1, 2, 3, 4)//获取数组当中的头部元素println(arr.head)//1//获取尾部元素println(arr.last)//7//获取数组当中的尾部元素,除了第一个其他都是尾部元素println(arr.tail.toBuffer)//ArrayBuffer(2, 3, 4, 5, 0, 8, 6, 9, 7)

二、Map

k-v键值对的集合,k不能重复

1、不可变Map
	//创建map集合val map = Map[String,Int]("xiaox"->11,("haha"->22),("xixi",33))println(map)//Map(xiaox -> 11, haha -> 22, xixi -> 33)//删除元素//返回一个新的集合,原集合不会改变val map1=map.drop(1)println(map1)//Map(haha -> 22, xixi -> 33)//查询元素println(map("haha"))//22//如果key在map中存在返回Some,意思就是存在,反之返回Noneprintln(map.get("xixi"))//Some(33)//如果key在map中存在返回Some,意思就是存在,反之返回第二个参数println(map.getOrElse("hha",44))//44//查询集合长度println(map.size)//查询集合中是否包含某个元素println(map.contains("xixi"))
2、可变Map
 	//默认创建的是不可变的集合,想要变成可变集合,需要导包import scala.collection.mutable._//创建map集合val map = Map("zhangs"->11,"xiaox"->22)println(map)//改变元素的value值map("zhangs")=33println(map)//增加元素第一种map.put("haha",18)println(map)//增加元素第二种map+=("xixi"->20)println(map)//增加元素第三种map+=(("ttt",44))println(map)//删除元素map.remove("ttt")println(map)//查询元素println(map("haha"))println(map.get("xixi"))println(map.getOrElse("zhang",999))
3、map集合的遍历
val map = Map[String,Int]("xiaox"->11,("haha"->22),("xixi",33))println(map)//第一种方式for((k,v)<-map){println(s"$k---$v")}//第二种方式for(i<-map){println(i)}//第三种,只要keyfor(i<-map.keys){println(i)}//第四种只要valuesfor(i<-map.values){println(i)}//foreach遍历map.foreach(println)map.foreach(x=>println(x._1))//打印keymap.foreach(x=>println(x._2))//打印valuesmap.keys.foreach((k:String)=>println(k))map.keys.foreach(println)map.values.foreach((v:Int)=>println(v))map.values.foreach(println)

三、元组(Tuple)

元组是不同类型的值的聚集。元组的值是通过将单个的值包含在圆括号中构成的。例如:(1, 3.14, “Fred”)是一个元组,最长可以容纳22个元素

//创建元组val tuple = new Tuple2[String,Int]("hello",4)//创建元组第二种val tuple1=(1,"hhh",3.4,true)//获取元组中指定元素println(tuple._2)//4println(tuple1._3)//3.4//如果想让元组当中元素下角标从0开始,需要调用方法,默认从1开始println(tuple1.productElement(3))//获取元组的长度println(tuple.productArity)//2//元组遍历for(i<-tuple1.productIterator){println(i)}tuple.productIterator.foreach(println)

四、Zip拉链操作

zip操作,就是将两个单列的集合,组合成双列的集合,集合中的每一组元素就是上述学习过的tuple。在组合两个集合的时候,集合元素两两一一对应,如果两个集合的长度不一致,将超过的部分,或者没有匹配上的部分进行裁剪,丢弃。

	//拉链测试//创建数组val arr1 = Array("lufei","xiangkesi","luojie","sabo","heihuzi")val arr2 = Array(13,23,34,21,77,99,55)//zip:进行拉链操作val res=arr1.zip(arr2)println(res.toBuffer)//ArrayBuffer((lufei,13), (xiangkesi,23), (luojie,34), (sabo,21), (heihuzi,77))//zipAll  第二个参数是左边数组如果空缺就补全”haha“,第三个参数是如果右边数组空缺就补全111val resul = arr1.zipAll(arr2,"haha",111)println(resul.toBuffer)//ArrayBuffer((lufei,13), (xiangkesi,23), (luojie,34), (sabo,21), (heihuzi,77), (haha,99), (haha,55))//zipWithIndex  给调用的数组右边补上索引println(arr1.zipWithIndex.toBuffer)//ArrayBuffer((lufei,0), (xiangkesi,1), (luojie,2), (sabo,3), (heihuzi,4))

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Transformers 微调

Transformers 微调 基于 Transformers 实现模型微调训练的主要流程数据字段数据拆分&#xff08;分成训练跟测试&#xff09;下载数据集数据集抽样预处理数据数据抽样微调训练配置加载 BERT 模型训练超参数&#xff08;TrainingArguments&#xff09;模型权重保存路径(output_d…

2024.4.19 Python爬虫复习day07 可视化3

综合案例 需求: 已知2020年疫情数据,都是json数据,需要从文件中读出,进行处理和分析,最终实现数据可视化折线图 相关知识点: json json简介: 本质是一个特定格式的字符串 举例: [{},{},{}] 或者 {}python中json包: import jsonpython数据转为json数据: 变量接收json…

微服务架构使用和docker部署方法(若依)

这里以若依官方网站开源的微服务框架为例子记录使用方法过程。 开源地址&#xff1a;RuoYi-Cloud: &#x1f389; 基于Spring Boot、Spring Cloud & Alibaba的分布式微服务架构权限管理系统&#xff0c;同时提供了 Vue3 的版本 下载后&#xff0c;用IDEA社区版开发工具打…

【量化交易】顶底分型策略

在众多的量化策略中&#xff0c;顶底分型策略因其独特的市场趋势捕捉能力和简洁的实现方式而受到许多投资者的青睐。本文将详细介绍顶底分型策略的原理&#xff0c;并展示如何使用Python在聚宽平台上实现这一策略。 感兴趣的朋友&#xff0c;可以在下方公号内回复&#xff1a;0…

GNU Radio Radar Toolbox编译及安装

文章目录 前言一、GNU Radio Radar Toolbox 介绍二、gr-radar 安装三、具体使用四、OFDM 雷达仿真 前言 GNU Radio Radar Toolbox&#xff08;gr-radar&#xff09;是一个开放源码的工具箱&#xff0c;用于 GNU Radio 生态系统&#xff0c;主要目的是为雷达信号处理提供必要的…

vue源码解析——diff算法/双端比对/patchFlag/最长递增子序列

虚拟dom——virtual dom&#xff0c;提供一种简单js对象去代替复杂的 dom 对象&#xff0c;从而优化 dom 操作。virtual dom 是“解决过多的操作 dom 影响性能”的一种解决方案。virtual dom 很多时候都不是最优的操作&#xff0c;但它具有普适性&#xff0c;在效率、可维护性之…

Leetcode 3111. Minimum Rectangles to Cover Points

Leetcode 3111. Minimum Rectangles to Cover Points 1. 解题思路2. 代码实现 题目链接&#xff1a;3111. Minimum Rectangles to Cover Points 1. 解题思路 这一题在这次比赛的4道题当中算是比较简单的&#xff0c;基本就只需要将所有的点排序之后然后使用贪婪算法来cover住…

【C++造神计划】运算符

1 赋值运算符 赋值运算符的功能是将一个值赋给一个变量 int a 5; // 将整数 5 赋给变量 a 运算符左边的部分叫作 lvalue&#xff08;left value&#xff09;&#xff0c;右边的部分叫作 rvalue&#xff08;right value&#xff09; 左边 lvalue 必须是一个变量 右边 rval…

木马免杀代码之python反序列化分离免杀

本篇文章主要用到python来对CobaltStrike生成的Shellcode进行分离免杀处理, 因此要求读者要有一定的python基础, 下面我会介绍pyhon反序列化免杀所需用到的相关函数和库 exec函数 exec函数是python的内置函数, 其功能与eval()函数相同, 但不同的是exec函数支持多行python代码…

我国新戊二醇产能逐渐增长 市场集中度有望进一步提升

我国新戊二醇产能逐渐增长 市场集中度有望进一步提升 新戊二醇&#xff08;NPG&#xff09;又称为2,2-二甲基-1,3-丙二醇&#xff0c;化学式为C5H12O2&#xff0c;熔点为124-130℃。新戊二醇多表现为一种无特殊气味的白色结晶固体&#xff0c;易溶于水及醇、醚等溶液。新戊二醇…

为什么看到这么多人不推荐C++?

前几天逛知乎的时候&#xff0c;看到一个问题&#xff1a; 看到这个问题我倒是想吐槽几句了。 C一直没找到自己的定位&#xff01; C语言&#xff1a;我是搞系统编程开发的&#xff0c;操作系统、数据库、编译器、网络协议栈全是我写的。 PHP&#xff1a;我是搞后端业务开发…

docker compose安装及安装慢解决办法

docker compose安装 Compose下载添加执行权限创建软链测试安装结果 Compose下载 curl -SL "https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose上述compose是在docker官方git…

一年期SSL证书怎么申请?

申请SSL证书三步走 JoySSL_JoySSL SSL证书_JoySSL https证书-JoySSL 一、选证书类型 根据网站性质与安全需求&#xff0c;选定合适的SSL证书&#xff1a; - 域名验证证书&#xff08;DV&#xff09;&#xff1a;快速验证域名所有权&#xff0c;适用于个人网站、博客&#xff…

ReentrantLock源码阅读

1. 概述 lock锁, 基于队列同步器AQS, 实现公平锁、非公平锁 队列同步器AQS可以阅读我这篇文章&#xff1a; 点击传送 实现了Lock接口: public class ReentrantLock implements Lock// 加锁 获取不到锁一直等待 void lock(); // 加锁 获取不到锁一直等待 等待过程可以被中断…

websocket原理及简单入门

在了解websocket之前,我们先来了解一下websocket出现之前的世界 当我们在开腾讯会议或视频通话时,我们自己的影像会传给对方,对方的影像也能同时传给我们,这就是即时通讯技术 即时通讯技术是实现&#xff1a;服务器端可以时地将数据的更新或变化反应到客户端&#xff0c;在Web中…

Python中操作Excel表对象并打包为脚本

一、准备工作 pip install pandas pip install openpyxl pip install pyinstaller 数据表格&#xff1a; 数据表下载 二、执行写入操作 import pandas as pd # pyinstaller --onefile attendance_records_score.py # 打包 # 读取源Excel文件&#xff08;假设源表有列A…

【攻防世界】php_rce (ThinkPHP5)

进入题目环境&#xff0c;查看页面信息&#xff1a; 页面提示 ThinkPHP V5&#xff0c;猜测存在ThinkPHP5 版本框架的漏洞&#xff0c;于是查找 ThinkPHP5 的攻击POC。 构造 payload: http://61.147.171.105:50126/?sindex/think\app/invokefunction&functioncall_user_f…

【Go语言快速上手(一)】 初识Go语言

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; Go快速上手 1. 前言2. Go语言简介(为…

模拟Android系统Zygote启动流程

版权声明&#xff1a;本文为梦想全栈程序猿原创文章&#xff0c;转载请附上原文出处链接和本声明 前言&#xff1a; 转眼时间过去了10年了&#xff0c;回顾整个10年的工作历程&#xff0c;做了3年的手机&#xff0c;4年左右的Android指纹相关的工作&#xff0c;3年左右的跟传感…

什么是三次握手和四次握手

三次握手和四次挥手是TCP协议中用于建立和终止TCP连接的重要机制。 三次握手是TCP连接建立的过程&#xff0c;具体步骤如下&#xff1a; 客户端发送一个带有SYN标志的数据包给服务端&#xff0c;表示希望建立连接。服务端收到后&#xff0c;回传一个带有SYN/ACK标志的数据包&…