scala 数据结构

1. 容器

mutable 可变

immutable 不可变

2. 列表

2.1 列表声明与构建

列表是一种共享相同类型的不可变的对象序列,声明时必须初始化。

var strList = List("one", "two", "three", "four")
// 取列表首元素
println(strList.head)
println(strList(0))
// one
println(strList.tail)
// List(two, three, four)
// 取列表最后一个元素
println(strList(strList.length-1))
// four
println(strList.reverse)
// List(four, three, two, one)

列表构建

在已有列表前端增加元素

var newList = "zero"::strList
// List(zero, one, two, three, four)

val a1 = List(1,2,3)
等价于
val a2 = 1::2::3::Nil

3. 集合

集合是不重复元素的容器,以“哈希”方法对元素的值进行组织(元素无序)可以快速地找到某个元素。(列表查找复杂度o(n),集合查找复杂度o(1))。

集合包括可变集合与不可变集合,缺省情况下是不可变集。

3.1 不可变集合

var myset = Set("one", "two")
// 这里可以执行成功,因为myset是可变的,相当于生成了一个新的集合,(myset前后指向的是不同的集合)
myset += "five"
println(myset)
// Set(one, two, five)

3.2 可变集合

import scala.collection.mutable.Set

val myset = Set("one", "two")
// 这里虽然myset是不可变的,但集合是可变的,myset前后指向的是同一个集合
myset += "five"
println(myset)
// Set(one, two, five)

4. 映射

map 与set一样也分为可变与不可变两种,缺省情况下不可变。map 可以根据键来对值进行快速的检索。

4.1 不可变map

无法更新元素,也无法增加元素。

var mymap = Map("one"->1, "two"->2)
// 增加元素,生成了一个新的map
mymap += ("five"->5)
// mymap("one") = 11  会报错,无法修改元素!!!
println(mymap)
// Map(one -> 1, two -> 2, five -> 5)
// 查找元素
println(mymap("five"))
// 5
// 是否包含某个键,键不存在会抛出异常
println(mymap.contains("five"))
// true

4.2 可变map

import scala.collection.mutable.Map

val mymap = Map("one"->1, "two"->2)
// 增加元素,还是同一个map
mymap += ("four"->4,"five"->5)
// 修改元素
mymap("one") = 11
println(mymap)
// Map(one -> 11, four -> 4, five -> 5, two -> 2)

4.3 遍历map

var mymap = Map("one"->1, "two"->2)
for((k,v) <- mymap)
    println(k,v)
for(k <- mymap.keys)
    println(k)
for(v <- mymap.values)
    println(v)
// map长度
println(mymap.size)

5. 迭代器

iter 不是一个集合,但提供了访问集合的一种方法。

5.1 遍历迭代器

val iter = Iterator("one", "two", "three")
for(e <- iter){
    println(e)
}

while(iter.hasNext){
    println(iter.next())
}

5.2 grouped方法返回元素的增量分块

val mylist = List(1, 2, 3, 4, 5)
val git = mylist.grouped(3)
// val git = mylist grouped 3
println(git)
// non-empty iterator
println(git.next())
// List(1, 2, 3)
println(git.next())
// List(4, 5)

5.3 sliding方法生成一个滑动元素的窗口

val mylist = List(1, 2, 3, 4, 5)
val sit = mylist.sliding(3)
println(sit)
// non-empty iterator
println(sit.next())
// List(1, 2, 3)
println(sit.next())
// List(2, 3, 4)
println(sit.next())
// List(3, 4, 5)

6. 数组

数组是一种可变的,可索引的,元素具有相同类型的数据集合。

6.1 数组定义与遍历

val arr = new Array[Int](3)
arr.foreach(print)
// 000 每个数组元素初始化为0
arr(0) = 1

for(i <- 0 until arr.size)
    println(arr(i))
for(i <- 0 to arr.size-1)
    println(arr(i))
for(e <- arr)
    println(e)

// 自动推断数组类型
val bb = Array(11, 22, 33)

6.2 多维数组

// 二维数组
val bb = Array.ofDim[Int](3,4)
bb(1)(2) = 123

// 三维数组
val bb = Array.ofDim[String](2,3, 2)
bb(1)(1)(1) = "boy"

6.3 不定长数组

使用Array类型定义的数组,属于定长数组,其长度在初始化后就不能改变。

使用ArrayBuffer类型可以定义变长数组。

val aa = ArrayBuffer(10, 20, 30)
aa += 40
println(aa)
// ArrayBuffer(10, 20, 30, 40)
// 从第二个位置起插入50,60
aa.insert(2,50,60)
println(aa)
// ArrayBuffer(10, 20, 50, 60, 30, 40)
aa -= 40
println(aa)
// ArrayBuffer(10, 20, 50, 60, 30)
aa.remove(1)
println(aa)
// ArrayBuffer(10, 50, 60, 30)

7. 元组

元组是不同类型的值的聚集(元组中元素类型可以不同,但数组中必须相同)。

val aa = ("boy", 17, 123.4)
// 取第一个元素
println(aa._1)
// boy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值