文章目录
- Scala 数据结构-集合
- 一、集合简介
- 1、不可变集合继承图
- 2、可变集合继承图
- 二、数组
- 1、不可变数组
- (1) 创建数组
- (2) 访问数组
- (3) 遍历数组
- (4) 添加元素
Scala 数据结构-集合
一、集合简介
1)Scala的集合有三大类:序列seq,集合Set,映射Map,所有的集合都扩展自Iterable
特质.
2)对于几乎所有的集合类,Scala都同时提供了可变
和不可变
的版本,分别位于以下两个包
不可变集合:scala.collection.immutable
可变集合:scala.collection.mutable
3)Scala不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而不会对原对象进行修改,类似于java中的String对象
4)可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象,类似于java中的StringBuilder对象
小窍门建议:在操作集合的时候,不可变用符号,可变用方法
1、不可变集合继承图
seq
序列相当于替代的是Java里面的list
列表
1)Set
,Map
是Java中也有的集合
2)Seq
是Java中没有的,我们发现List
归属到Seq
了,因此这里的List
就和Java不是同一个概念了
2、可变集合继承图
二、数组
1、不可变数组
(1) 创建数组
1)第一种方式定义数组
定义:val arr1 = new Array[Int](10)
(1) new
是关键字
(2) [Int]
是指可以存放的数据类型,如果希望存放任意数据类型,则指定Any
[]里面是泛型,只是Java里的是<>
(3) (10)
,表示数组的大小,确定后就不可以变化
2)第二种创建数组方式
val arr2 = Array(12,21,23,66,97) //可以直接创建的时候赋值,我比较喜欢这种,其实是Array.apply() 但是apply可以省略
3) 案例示例
这下面说了两种创建数组的方式,第一种是使用泛型,创建的时候,没有赋值,所有的元素都为0,第二种是使用了apply方法,我更喜欢第二种。可以创建的时候直接赋值
package Scala03_shujujiegou
//不可变数组
class test01_bukebian {
}
object test01_bukebian{
def main(args: Array[String]): Unit = {
//1、创建一个不可变的数组
val arr1:Array[Int] = new Array[Int](10) //创建一个大小为10,长度为10的数组
//2、另一种创建方式 这种方式比较棒
val arr2 = Array(5,12,46,58,97) //可以通过Array.apply(12)方法创建,然后apply可以省略,创建了长度为5的数组
}
}
(2) 访问数组
访问是arr1(0)
括号里面是索引,是() 不是 [],可以对属性值进行修改,但是不可变数组的添加和删除操作做不了
package Scala03_shujujiegou
//不可变数组
class test01_bukebian {
}
object test01_bukebian{
def main(args: Array[String]): Unit = {
//1、创建一个不可变的数组
val arr1:Array[Int] = new Array[Int](10) //创建一个大小为10,长度为10的数组
//2、另一种创建方式 这种方式比较棒
val arr2 = Array(5,12,46,58,97) //可以通过Array.apply(12)方法创建,然后apply可以省略,创建了长度为5的数组
println(arr2.apply(1))
println(arr1.apply(2))
//3、访问方式 删除数据和插入数据对于不可变数组是做不到的,但是对于改变某个位置上的值是可以做到的
println(arr1(0)) //访问很简单。直接arr() 里面是索引 是()不是[]
println(arr2(0))
//println(arr1(10)) //这里为10的话那么就越界了
arr1(0) = 12 //赋值也是按照访问的方式,然后进行赋值,再进行访问就可以了
arr1(4) = 97
println(arr1(0))
println(arr1(4))
}
}
(3) 遍历数组
因为数组只有五个值,一个一个进行访问还是比较简单,但是要是有500个数,不可能一行一行的500行代码,所以要遍历数组
总结: 这些遍历的方法不只是数组可以用,其他的数据类型也可以用
下面一共五个遍历数组的方法:
1、普通for循环
for(i <- 0 until arr.length){ println(arr(i)) }
2、增强for循环,不遍历索引,只遍历元素
for(i <- arr){ println(i) }
3、迭代器 一般使用while循环,就两个方法,判断写一个元素存不存在,存在就输出下一个元素
val iter = arr.iterator while(iter.hasNext){ println(iter.next) }
4、forEach 方法
arr.forEach((i:Int)=>println(i)) //这个里面的参数是一个函数
arr.forEach(println) //可以简化成直接println,里面参数
5、mkString 将数组里的元素连在一起输出,这个也非常好用,对应的是python里的join
arr.mkString(",")
package Scala03_shujujiegou
//不可变数组
class test01_bukebian {
}
object test01_bukebian{
def main(args: Array[String]): Unit = {
//1、创建一个不可变的数组
val arr1:Array[Int] = new Array[Int](10) //创建一个大小为10,长度为10的数组
//2、另一种创建方式 这种方式比较棒
val arr2 = Array(5,12,46,58,97) //可以通过Array.apply(12)方法创建,然后apply可以省略,创建了长度为5的数组
println(arr2.apply(1))
println(arr1.apply(2))
//3、访问方式 删除数据和插入数据对于不可变数组是做不到的,但是对于改变某个位置上的值是可以做到的
println(arr1(0)) //访问很简单。直接arr() 里面是索引 是()不是[]
println(arr2(0))
//println(arr1(10)) //这里为10的话那么就越界了
arr1(0) = 12 //赋值也是按照访问的方式,然后进行赋值,再进行访问就可以了
arr1(4) = 97
println(arr1(0))
println(arr1(4))
println("====================")
//4、数组的遍历
// 1) 普通for循环
//报黄说明不是最简单的实现方式,但是我比较喜欢这种
for(i <- 1 until arr2.length){ //scala里面用until 就可以不用数组-1了
println(arr2(i))
}
println("==================")
for(i <- arr2.indices){
println(arr2(i))
}
println("=================")
//2) 增强for循环
//其实访问一个集合里面的元素,没有必要非要去遍历他的索引,我们根本不去考虑索引,只是想要将所有的数据打印输出
//直接遍历所有元素,增强for循环
for(i <- arr2){ //直接从数组里面拿数,就不用索引了
println(i)
}
println("=============")
//3)迭代器
val iter = arr2.iterator //定义一个迭代器,数组.iterator方法
while (iter.hasNext){ //一般迭代器使用while循环,因为就两个方法,如果存在,就输出下一个
println(iter.next())
}
println("=============")
//4) 调用forEach方法 跟增强for循环完全等价,都是直接输出的元素
//所有的集合类型都可以调forEach方法,只不过具体的实现,可能略有不同
arr2.foreach((i:Int) => println(i)) //他这里面的参数应该是一个函数,然后我写的lamdam表达式,i int类型,然后要做的操作是输出元素
arr2.foreach(println) //可以简化成直接一个println ,因为数组是Int类型那系统可以自己推断,然后变量i可以用_代替
//5) mkString 方法,将所有数连在一起输出,这个也很方便
println(arr2.mkString(",")) //要是想把所有数连在一起输出,使用mkString方法
}
}
(4) 添加元素
因为不可变数组是不可以直接添加元素的,所以我们赋值个一个新的变量对象,然后就可以进行修改了,然后调用这个新的数组
有两种方式: 推荐第二个方法
第一种:
val arr3 = arr2.:+(13)
//这样是加在原数组的后面
val arr3 = arr2.+:(14)
//吧.+: 这个+和:反过来就是在前面加
第二种:
var arr4 = 66 +: 12+: arr2 :+ 14 :+ 13
// + 在前面的就是加在数组的前面,+在后面的就是加在数组的后面,就非常直观了,不容易搞错,而且还可以一次性添加多个
package Scala03_shujujiegou
//不可变数组
class test01_bukebian {
}
object test01_bukebian{
def main(args: Array[String]): Unit = {
//1、创建一个不可变的数组
val arr1:Array[Int] = new Array[Int](10) //创建一个大小为10,长度为10的数组
//2、另一种创建方式 这种方式比较棒
val arr2 = Array(5,12,46,58,97) //可以通过Array.apply(12)方法创建,然后apply可以省略,创建了长度为5的数组
println(arr2.apply(1))
println(arr1.apply(2))
//3、访问方式 删除数据和插入数据对于不可变数组是做不到的,但是对于改变某个位置上的值是可以做到的
println(arr1(0)) //访问很简单。直接arr() 里面是索引 是()不是[]
println(arr2(0))
//println(arr1(10)) //这里为10的话那么就越界了
arr1(0) = 12 //赋值也是按照访问的方式,然后进行赋值,再进行访问就可以了
arr1(4) = 97
println(arr1(0))
println(arr1(4))
println("====================")
//4、数组的遍历
// 1) 普通for循环
//报黄说明不是最简单的实现方式,但是我比较喜欢这种
for(i <- 1 until arr2.length){ //scala里面用until 就可以不用数组-1了
println(arr2(i))
}
println("==================")
for(i <- arr2.indices){
println(arr2(i))
}
println("=================")
//2) 增强for循环
//其实访问一个集合里面的元素,没有必要非要去遍历他的索引,我们根本不去考虑索引,只是想要将所有的数据打印输出
//直接遍历所有元素,增强for循环
for(i <- arr2){ //直接从数组里面拿数,就不用索引了
println(i)
}
println("=============")
//3)迭代器
val iter = arr2.iterator //定义一个迭代器,数组.iterator方法
while (iter.hasNext){ //一般迭代器使用while循环,因为就两个方法,如果存在,就输出下一个
println(iter.next())
}
println("=============")
//4) 调用forEach方法 跟增强for循环完全等价,都是直接输出的元素
//所有的集合类型都可以调forEach方法,只不过具体的实现,可能略有不同
arr2.foreach((i:Int) => println(i)) //他这里面的参数应该是一个函数,然后我写的lamdam表达式,i int类型,然后要做的操作是输出元素
arr2.foreach(println) //可以简化成直接一个println ,因为数组是Int类型那系统可以自己推断,然后变量i可以用_代替
//5) mkString 方法,将所有数连在一起输出,这个也很方便
println(arr2.mkString(",")) //要是想把所有数连在一起输出,使用mkString方法
println("===========")
//添加元素
//因为不可变数据是不可以添加数据的
//我们说的不是直接在当前数组上直接改变这个数组,而是说添加元素之后,我们再把它作为一个新的数组返回
val arr3 = arr2.:+(17) //.:+() 然后里面是要添加的元素 直接调用的话还是原来的数组,因为不可变数组是不可以改变的,我们把他创建一个新的对象
println(arr3.mkString(",")) //赋值给新的变量,就可以看到添加成功了
//不只是可以在最后面进行添加,也可以在前面进行添加
val arr4 = arr2.+:(18) //把.:+ 改为 .+: 就成在前面添加元素了
println(arr4.mkString(","))
arr4.foreach(println)
println("===============")
//这个样子看不懂的话,下面这种比较棒 这个有点像链表的那种添加
val arr5 = 13 +: 12 +: arr2 :+ 15 //这个样子+:然后数字写在前面就是在前面加 :+ 这样就是在后面加
println(arr5.mkString(","))
}
}