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

2024-04-15 01:36

本文主要是介绍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))

这篇关于Scala---集合(数组,Map,元组(Tuple),Zip拉链)详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904570

相关文章

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.