|NO.Z.00063|——————————|BigDataEnd|——|Hadoop&Scala.V02|——|Scala.v02|集合|Seq|
一、Seq
### --- seq
~~~ Seq代表按照一定顺序排列的元素序列;
~~~ 该序列是一种特别的可迭代集合,包含可重复的元素;
~~~ 元素的顺序是确定的,每个元素对应一个索引值;
### --- Seq提供了两个重要的子特质:
~~~ IndexedSeq:提供了快速随机访问元素的功能,它通过索引来查找和定位的
~~~ LinearSeq:提供了访问head、tail的功能,它是线型的,有头部和尾部的概念,通过遍历来查找。
二、List
### --- List
~~~ List代表元素顺序固定的不可变的链表,它是Seq的子类,在Scala编程中经常使用。
~~~ List是函数式编程语言中典型的数据结构,与数组类似,可索引、存放类型相同的元素。
~~~ List一旦被定义,其值就不能改变。
### --- List列表有头部和尾部的概念,可以分别使用head和tail方法来获取:
~~~ head返回的是列表第一个元素的值
~~~ tail返回的是除第一个元素外的其它元素构成的新列表
~~~ 这体现出列表具有递归的链表结构。
~~~ Scala定义了一个空列表对象Nil,定义为List[Nothing]
~~~ 借助 Nil 可将多个元素用操作符 :: 添加到列表头部,常用来初始化列表;
~~~ 操作符 ::: 用于拼接两个列表;
### --- 编程示例
// 构建List
val lst1 = 1 :: 2:: 3:: 4 :: Nil
// :: 是右结合的
val lst2 = 1 :: (2:: (3:: (4 :: Nil)))
// 使用 ::: 拼接List
val lst3 = lst1 ::: lst2
// 使用 head、tail获取头尾
lst3.head //返回第一个元素
lst3.tail //返回除第一个元素外的其它元素构成的新列表
lst3.init //返回除最后一个元素外的其它元素构成的新列表
lst3.last //返回最后一个元素
### --- 列表递归的结构,便于编写递归的算法:
package cn.yanqi.edu.scala.section3
import scala.util.Random
object test1 {
def main(args: Array[String]): Unit = {
val random = new Random(100)
val lst = List.fill(100)(random.nextInt(200))
println(lst)
println(s"sum(lst) = ${sum(lst)}; sum(lst) = ${lst.sum}")
println(quickSort(lst))
}
// 快排
def quickSort(lst: List[Int]): List[Int] = {
lst match {
case Nil => Nil
case head :: tail =>
val (less, greater) = tail.partition(_ < head)
quickSort(less) ::: head :: quickSort(greater)
}
}
}
二、编程实现
### --- 编程代码
package yanqi.cn.part09
object ListDemo {
def main(args: Array[String]): Unit = {
//Nil表示一个空的列表
//::操作符表示向集合中添加元素,它是从右往左进行运算的,所以集合对象一定要放在最右边
val list1 = 1 :: 2 :: 3 :: 4 :: Nil
val list2 = 5 :: 6 :: 7 :: 8 :: Nil
//使用:::操作符进行了拼接,不要使用::进行列表的拼接,因为这样拼接的结果不是我们想要的
val list3=list1:::list2
println(list3.head) //返回第一个元素
println(list3.tail) //返回除第一个元系之外的其他元素构成的新列表
println(list3.init) //返回除最后一个元素之外的其他元素构成的新列表
println(list3.last) //返回最后一个元素
val list4=List(4,2,6,1,7,9)
println(quickSort(list4))
}
def quickSort(list:List[Int]):List[Int]={
list match {
case Nil=>Nil
case head::tail=>
//通过partition将tail分为两部分
//小于head的元素放入less列表中,大于head的元素放入greater列表中
val (less,greater) =tail.partition(_<head)
quickSort(less):::head::quickSort(greater)
}
}
}
### --- 编译打印
D:\JAVA\jdk1.8.0_231\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=60094:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA\jdk1.8.0_231\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_231\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_231\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_231\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_231\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_231\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_231\jre\lib\rt.jar;E:\NO.Z.10000——javaproject\NO.Z.00002.Hadoop\ScalaPro\out\production\ScalaPro;D:\JAVA\scala-2.12.2\lib\scala-library.jar;D:\JAVA\scala-2.12.2\lib\scala-reflect.jar yanqi.cn.part09.ListDemo
1
List(2, 3, 4, 5, 6, 7, 8)
List(1, 2, 3, 4, 5, 6, 7)
8
List(1, 2, 4, 6, 7, 9)
Process finished with exit code 0
三、Queue
### --- Queue
~~~ 队列Queue是一个先进先出的结构。
~~~ 队列是一个有序列表,在底层可以用数组或链表来实现。
~~~ 先进先出的原则,就是先存入的数据,要先取出,后存入的数据后取出。
~~~ 在Scala中,有scala.collection.mutable.Queue和scala.collection.immutable.Queue,
~~~ 一般来说,我们使用的是scala.collection.mutable.Queue
### --- 编程示例
//创建可变的队列
val queue1 = new collection.mutable.Queue[Int]()
println(queue1)
//队列当中添加元素
queue1 += 1
//队列当中添加List
queue1 ++= List(2,3,4)
println(queue1)
// 按照进入队列顺序,删除队列当中的元素(弹出队列)
// 返回队列中的第一个元素,并从队列中删除该元素。
val dequeue = queue1.dequeue()
println(dequeue)
println(queue1)
// 向队列当中加入元素(入队列操作)
// 元素入队列
queue1.enqueue(5,6,7)
println(queue1)
//获取第一个、最后一个元素
println(queue1.head)
println(queue1.last)
四、编程实现
### --- 编程代码
package yanqi.cn.part09
import scala.collection.mutable
object QueueDemo {
def main(args: Array[String]): Unit = {
//创建一个可变的队列
val queue1=new mutable.Queue[Int]()
println(queue1)
//队列当中添加元素
queue1 +=1
//队列当中添加List列表
queue1 ++=List(2,3,4)
println(queue1)
//按照进入队列的顺序,删除队列当中的元素
//返回队列中的第一个元素,并从队列中删除这个元素
val dequeue=queue1.dequeue()
println(dequeue)
println(queue1)
//再向队列中添加元素
queue1.enqueue(5,6,7)
println(queue1)
//获取第一个、最后一个元素
println(queue1.head)
println(queue1.last)
}
}
### --- 编译打印
D:\JAVA\jdk1.8.0_231\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=60123:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA\jdk1.8.0_231\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_231\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_231\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_231\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_231\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_231\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_231\jre\lib\rt.jar;E:\NO.Z.10000——javaproject\NO.Z.00002.Hadoop\ScalaPro\out\production\ScalaPro;D:\JAVA\scala-2.12.2\lib\scala-library.jar;D:\JAVA\scala-2.12.2\lib\scala-reflect.jar yanqi.cn.part09.QueueDemo
Queue()
Queue(1, 2, 3, 4)
1
Queue(2, 3, 4)
Queue(2, 3, 4, 5, 6, 7)
2
7
Process finished with exit code 0
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv015-scala
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」