Scala语言基础(二)集合

Scala中的数组

Scala中数组按是否定长分为定长数组和变长数组

定长数组

元素个数确定,只能修改元素,不支持增加删除元素;

object ArrayTest01 {
  def main(args: Array[String]): Unit = {
    //定义定长数组
    val a = new Array[Int](10)//对应Java  int[] a = new int[10];
    val b = new Array[String](5)
    val c = Array("Tom","Jack","Rose")//对应Java  String[] c = {"Tom","Jack","Rose"};
  }
}

注意:
当使用关键字new时,小括号里面的参数表示数组的长度,否则只是定义了一个只有一个元素的定长数组(其实是调用了Array.apply(3),传入一个元素3),这个元素就是该参数:
在这里插入图片描述

变长数组

 //变长数组
    val d = ArrayBuffer[Int]()
    //向数组中添加元素
    d +=1
    d +=2
    d +=3
    //一次加多个元素
    d += (10,13,15)

    for(i <- 0 until d.length){println(d(i))}

    //去掉左后两个元素
    d.trimEnd(2)

    //把ArrayBuffer转换为Array
    d.toArray

数组的常用操作

求最值

import scala.collection.mutable.ArrayBuffer

object HelloWorld {
  def main(args: Array[String]): Unit = {
    val array = Array(10,3,5,7,9)

    //最大值
    val max = array.max
    println("max = "+max)

    //最小值
    val min = array.min
    println("min = " +min)

    //求和
    val sum = array.sum
    println("sum = " + sum)

    var array2 = ArrayBuffer(3,7,1,18,8,3)

    //for(i <- 0 until array2.length){println(array2(i))}
    for(j <- array2.sortWith(_ < _)){print(j+"\t")}//1	3	3	7	8	18	升序排序
    println()
    for(k <- array.sortWith(_ < _)){print(k+"\t")}//3	5	7	9	10	没有进行排序
  }
}

向集合中追加元素

当定义边长数组使,需要导包,否则会报错:
在这里插入图片描述

一次追加一个元素

在这里插入图片描述

一次追加多个元素

在这里插入图片描述

追加数组

在这里插入图片描述

不同类型的集合也能相互追加

在这里插入图片描述
总结:
+= 表示追加一个或多个元素;
++= 表示追加另一个集合里面的所有元素。

指定索引插入元素

可以一次插入一个元素,也可以一次插入多个元素,insert的第一个参数为插入集合的索引位置:
在这里插入图片描述

删除元素

remove的参数表示:第一个参数表示删除元素的起始索引,第二个元素表示删除元素的个数:
在这里插入图片描述

定长数组和变长数组之间的转换

定长 ->边长

在这里插入图片描述

变长 -> 定长

在这里插入图片描述

将集合转换成一个字符串

当mkString方法只有一个参数时,表示是个元素的连接符;
当mkString方法有三个参数时,中间参数是连接符,两边参数是开始和末尾加入的符号:
在这里插入图片描述

map方法

map:不停的从b获得元素交给函数func1作为输入参数,func1执行完毕后得到一个新的结果,map会初始化一个新的和b同类型的定长数组,将func1执行的结果作为元素添加到新数组中:
在这里插入图片描述其中func函数传入的数据类型必须和b的数据类型一致,否则会报错
在这里插入图片描述求集合中元素个数
在这里插入图片描述
此外,参数函数只能定义一个参数,而返回值是什么类型的是没有限制的。

reduce

通过reduce求最小值
在这里插入图片描述
通过reduce求最和
在这里插入图片描述
解释:给定两个参数x,y,一个是临时变量,一个是循环从集合b中获取一个元素作为值的变量,这样根据定义的函数逻辑,没获得集合中的一个元素后根据参数函数逻辑处理后的值赋值给临时变量,最终得到一个元素。
注意:
1,既然是聚合,必定是接收多个参数,返回较少的值,一般就是接收两个参数,返回一个值
2,参数函数的参数类型要和要处理集合元素的类型一致
3,参数函数的返回值类型必须和参数的输入类型一致(因为相当于每次取出集合中一个元素作为参数函数的一个参数,上一次参数返回值作为另一个参数,就是说参数函数的输出还会作为输入,所以输出类型必须和输出类型一致)

Scala中的集合

包括Seq,Set,Map三大类,包含:Tuple\Stack\Queue等数据结构;
集合有两个比较重要概念:
可变(mutable):当前集合中的元素可以更改
不可变(immutable):当前这个集合中的元素不可以更改
可参考文章

List

不可变的序列
1.通过import scala.collection.immutable._导入

2.在Scala中列表要么是空(Nil表示空列表)要么是一个head元素加上一个tail列表;
例如: 9 :: List(5,2) 其中 ::操作符是将给定的头和为创建一个新的列表,而且 ::操作符是从右向左结合的,如 9 :: 5 :: Nil 相当于9 :: (5::(2::Nill))

3.操作
向List中添加一个元素
根据List集合特点,就是头元素+尾列表,头元素当然在前面了
在这里插入图片描述
也可以通过特殊操作符控制插入元素的位置(尾部或头部)
在这里插入图片描述
总结:单个值必须与“+”相邻,值在右面就是将元素添加到尾部,值在左边就是将值添加到头部。

在Scala中,操作符也可以看成方法,如下图,to可以当做方法来使用:
在这里插入图片描述
而同理,“:+”也可以像方法一样使用:
在这里插入图片描述
总结:单个值必须与“+”相邻,值在右面就是将元素添加到尾部,值在左边就是将值添加到头部。

将两个list拼接成一个新的list
在这里插入图片描述
两个集合是不能相加的,报错:需要Sting类型
在这里插入图片描述
而传入一个String类型的数值后,相当于凭借成了一个字符串类
在这里插入图片描述
两个list拼接 “++”等价于“++:”,但是不能使用“:++”
在这里插入图片描述
也可以使用下面的方法,将b插入a的前面
在这里插入图片描述
判断列表是否为空
在这里插入图片描述

取出头,尾元素和尾队列
在这里插入图片描述
获取处最后一个元素的前面所有元素
感觉和tail操作相反
在这里插入图片描述
倒序列表
在这里插入图片描述
drop方法
参数表示丢弃几个元素(从前往后)
在这里插入图片描述
take方法
从一个列表中取子列表,参数取几个元素
在这里插入图片描述
splitAt方法
发现下面这种方法不能进行正常切割,因为这样的通过下面这种方法定义出来的是不可变列表,应该有方法强制分隔,现在还不知道

scala> val c = List(1.to(10))
c:List[scala.collection.immutable.Range.Inclusive] = List(Range(1, 2, 3, 4, 5,6,7,8,9,10))

scala> c.splitAt(4)
res48:(List[scala.collection.immutable.Range.Inclusive], List[scala.collection.immutable.Range.Inclusive]) = (List(Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)),List())

而重新定义一个新的列表,便可以进行切割了
在这里插入图片描述
将列表分隔成立元素为2个列表的元组,可以通过下面方法查看元组的元素
在这里插入图片描述
zip方法
将两个元素个数相同的列表的元素一一对应组合成元组,然后将元组放到一个新的列表中
在这里插入图片描述
然后可以将其转换成Map
在这里插入图片描述
mkString方法
将列表中的元素转换成字符串
在这里插入图片描述

Set

主要用于去重,求交集、并集、差集
immutable
在这里插入图片描述
如下图两个集合
在这里插入图片描述求交集
在这里插入图片描述
求并集
在这里插入图片描述
求差集
在这里插入图片描述
mutable
当只使用“+”时,元集合是不会变的,当使用“+=”才会在元集合中添加元素:
在这里插入图片描述
一次增加多个元素
在这里插入图片描述
“++=”:在原来集合基础上添加一个集合
在这里插入图片描述
add添加一个元素
在这里插入图片描述

remove删除一个元素
在这里插入图片描述“-=”删除一个元素
在这里插入图片描述

Map

构建一个Map
在这里插入图片描述访问
在这里插入图片描述
Map中有三种类型:Option,Some,None,其中Option是父类,其他是子类,Some表示有值,None表示无值,这样可以避免使用下标时抛出无值的异常。
还有一个更好的方法getOrElse(),有传入键所对应的值,就会返回,否则返回默认值:
在这里插入图片描述
定义可变Map,向其中添加元素
在这里插入图片描述
删除元素
在这里插入图片描述

Tuple

定义一个元组,元组中可以包含任意类型的值,定义之后不能改变
在这里插入图片描述
注意似乎不能定义一个元素的元组
在这里插入图片描述

访问元组里面的元素
在这里插入图片描述特殊用法:
在这里插入图片描述总结:
(1)List,Set定义之后类型就确定了,所有元素都是同一类型,且随着时间的迁移,这些集合中的元素有可能会增加,删除,更改
(2)Tuple能组合多个不同类型的值在一起,形成一个不可变的一个数据的整体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值