Scala中数据结构(基础)

Scala中数据结构(基础)

scala集合基本介绍

1)Scala同时支持不可变集合和可变集合,不可变集合可以安全的并发访问
两个主要的包:
不可变集合:scala.collection.immutable
可变集合:scala.collection.mutable
2)Scala默认采用不可变集合,对于几乎所有的集合类,Scala都同时提供了可变和不可变的版本
3)Scala的集合有三大类:序列(有序的,Linear Seq),集合Set、映射Map【key-value】,所有的集合都扩展自Iterable特质。

不可变集合


1)Set,Map是Java中也有的集合
2)Seq是Java没有的,其中List归属于Seq了,因此这里的List就和Java中的List不是同一个概念了
3)for循环中的1 to 3就是IndexdSeq下的Vector
4)String也是属于IndexSeq
5)其中经典的数据结构比如Queue和Stack被归属到LinearSeq
6)Scala中的Map体系有一个SortedMap,说明Scala的Map可以支持排序
7)IndexSeq和LinearSeq的区别是 IndexSeq通过索引来查找和定位,因此速度快,LinearSeq是线性的,即有头尾的概念。
8)

可变集合

在这里插入图片描述
1)可变集合比不可变集合更加丰富
2)在Seq集合中,增加了Buffer集合,在开发中,我们常用的有ArrayBuffer和ListBuffer
3)如果涉及到线程安全可以选择使用syn..开头的集合

数组

//定义
val arr1 = new Array[Int](4) //底层int[] arr1 = new int[4]
//使用apply方法创建数组对象
val arr2 = Array[Int](1,2)
//赋值
arr1(2) = 5
//遍历
for (ele <- arr1) println(ele)
arr1.foreach(x => println(x + " "))

//变长数组
val arr2 = ArrayBuffer[Int](2,3,4)
arr2.append(5)
arr2.remove(2)
for(ele <- arr2) print(ele + " ")

//多维数组
val arr = Array.ofDim[Double](3,4)   
for(item <- arr) {
	for(item2 <- item) {
	}
}

操作
在这里插入图片描述

元组

元组可以理解为一个容器,可以存放各种相同或不同类型的数据,就是将多个无关的数据封装为一个整体,称为元组。
元组最大的特点就是灵活,对数据没有过多的约束。
注意:元组中最多只能由22个元素。

//元组的定义
val tuple1 = (1,2,3,"hello",2.3)
//访问元组中的数据
println(tuple1._1)
println(tuple1.productElement(2))
//元组的遍历
//元组是一个整体,遍历需要调用其迭代器
for (ele <- tuple1.productIterator){
	println(ele)
}

List

Scala中的List和Java List不一样,在Java中List是一个接口,真正存放数据是ArrayList,而Scala的List可以直接存放数据,就是一个object,默认情况下Scala的List是不可变的,List属于序列Seq。

//不可变List
val list = List(1,2,3)
//通过 :+ 和 +: 给list追加元素(本身的集合并没有变化)
val list2 = list :+ 4
val list3 = 5 +: list
println(list)
println(list2)
println(list3)
//::表示向集合中新建添加元素,运算时,集合对象一定要放置在最右边
//::: 运算符是将集合中的每一个元素加入到集合中去
//运算规则:从右到左
val list4 = 6 :: list ::: Nil
println(list4)

//可变List,可以添加,删除元素,ListBuffer属于序列
//List中添加元素
val listBuffer = ListBuffer(1,2,3)
listBuffer.append(2)
listBuffer.foreach(x => print(x + " "))

队列

/**
  * 在scala中由scala.collection.mutable.Queue和scala.collection.immutable.Queue
  * 在实际开发中,通常使用可变集合中的队列
  */
val q1 = new Queue[Int]
q1 += 3
q1 += 4
q1 ++= List(5,6,7)
println("q1: = " + q1)
val ele = q1.dequeue()
q1.enqueue(4,5,6)
println(q1.head)
println(q1.tail)

Map

/**
 * Scala中的Map和Java类似,也是一个散列队
  * Scala中不可变(scala.collection.immutable.Map)的Map是有序的,
  * 可变的Map(scala.collection.mutable.Map)是无序的
  */
//不可变Map
val map1 = Map("Alice"->10,"Bob"->20,"chen"->5)
val map1_1 = Map(("Alice",10),("Bob",20),("chen",5))
println(map1)
val map2 = collection.mutable.Map("Alice"->10,"Bob"->20,"chen"->5)
println(map2)
//取值
map1.get("Alice")
map1.getOrElse("chend",20)

//修改
//	map1("chen") = 50  map是可变的才能修改,否则报错
map2("chen") = 50
//添加
map2 += ("chen2" -> 45)
map2.put("xxx",90)
println(map2)
//删除(key存在就删除,不存在也不会报错)
map2 -= ("xxx","ffff")
//遍历
for ((k,v) <- map1) print(k,v)
for (k <- map1.keys) print(k + " ")
for (v <- map1.values) print(v + " ")
for (v <- map1) print(v + " ")

Set

val set = Set(1,2,3)
val set2 = collection.mutable.Set(1,2,3)
set2.add(1)
for (ele <- set) println(ele)
posted @ 2019-02-20 12:31  刘丽刚  阅读(392)  评论(0)    收藏  举报