文章目录
Scala day05
集合
数组
不可变数组
val arr: Array[Int] = new Array[Int](10)
import scala.collection.mutable.ArrayBuffer
object TestArray{
def main(args: Array[String]): Unit = {
//(1)数组定义
val arr01 = new Array[Int](4)
println(arr01.length) // 4
//(2)数组赋值
//(2.1)修改某个元素的值
arr01(3) = 10
//(2.2)采用方法的形式给数组赋值
arr01.update(0,1)
//(3)遍历数组
//(3.1)查看数组
println(arr01.mkString(","))
//(3.2)普通遍历
for (i <- arr01) {
println(i)
}
//(3.3)简化遍历
def printx(elem:Int): Unit = {
println(elem)
}
arr01.foreach(printx)
// arr01.foreach((x)=>{println(x)})
// arr01.foreach(println(_))
arr01.foreach(println)
//(4)增加元素(由于创建的是不可变数组,增加元素,其实是产生新的数组)
println(arr01)
val ints: Array[Int] = arr01 :+ 5
println(ints)
}
}
package com.gc.scala.day05.arr
/**
* Author guochao
* Date 2021/5/8 15:22
*/
object Array1 {
def main(args: Array[String]): Unit = {
//创建数组长度为10的int数组 等价于java: new Int[10]
val arr: Array[Int] = new Array[Int](10)
println(arr)
}
}
可变数组
val buffer1: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4)
val buffer2: ArrayBuffer[Int] = new ArrayBuffer[Int]()
import scala.collection.mutable.ArrayBuffer
object TestArrayBuffer {
def main(args: Array[String]): Unit = {
//(1)创建并赋值可变数组
val arr01 = ArrayBuffer[Any](1, 2, 3)
//(2)遍历数组
for (i <- arr01) {
println(i)
}
println(arr01.length) // 3
println("arr01.hash=" + arr01.hashCode())
//(3)增加元素
//(3.1)追加数据
arr01.+=(4)
//(3.2)向数组最后追加数据
arr01.append(5,6)
//(3.3)向指定的位置插入数据
arr01.insert(0,7,8)
println("arr01.hash=" + arr01.hashCode())
//(4)修改元素
arr01(1) = 9 //修改第2个元素的值
println("--------------------------")
for (i <- arr01) {
println(i)
}
println(arr01.length) // 5
}
}
package com.gc.scala.day05.arr
import scala.collection.mutable.ArrayBuffer
/**
* Author guochao
* Date 2021/5/8 15:28
*/
object Array2 {
def main(args: Array[String]): Unit = {
val buffer1: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4)
val buffer2: ArrayBuffer[Int] = new ArrayBuffer[Int]()
// println(buffer)
// println(buffer1)
// val b2: ArrayBuffer[Int] = buffer1 :+ 10
//原地添加buffer1,在尾部添加元素
buffer2 += 100
200 +=: buffer2 //在头部添加
println(buffer2) //ArrayBuffer(200, 100)
val b3 = buffer1 ++ buffer2 //合并
println(b3)
buffer1 ++= buffer2 //把buffer2的集合追加到buffer1的后面,更新的是buffer1
buffer1 ++=: buffer2 //把buffer1的元素添加到buffer2的前面,更新的是buffer2
println(buffer1) //ArrayBuffer(1, 2, 3, 4, 200, 100)
println(buffer2) //ArrayBuffer(1, 2, 3, 4, 200, 100, 200, 100)
buffer1 -= 1
}
}
不可变数组与可变数组的转换
arr1.toBuffer //不可长数组转可变数组
arr2.toArray //可变数组转不可变数组
(1)arr2.toArray返回结果才是一个不可变数组,arr2本身没有变化
(2)arr1.toBuffer返回结果才是一个可变数组,arr1本身没有变化
package com.gc.scala.day05.arr
import scala.collection.mutable.ArrayBuffer
/**
* Author guochao
* Date 2021/5/8 16:07
*/
object Array3 {
def main(args: Array[String]): Unit = {
val arr1 = Array(30, 50, 70, 60, 10, 20)
val bufffer = arr1.toBuffer //不可变数组转换为可变
println(bufffer)
val b = ArrayBuffer(10, 20)
println(b.toArray.mkString) // .toArray可变数组转不可变数组
}
}
多维数组
- 定义
val arr = Array.ofDim[Double](3,4)
说明:二维数组中有三个一维数组,每个一维数组中有四个元素
package com.gc.scala.day05.arr
/**
* Author guochao
* Date 2021/5/8 16:11
*/
object Array4 {
def main(args: Array[String]): Unit = {
//多维数组 二维数组 假的,是用一维数组模拟的多维数组
val arr: Array[Array[Int]] = Array.ofDim[Int](2, 3) //生成一个2x3的数组
println(arr(0)(1))
//遍历
for (a1 <- arr) {
for (elem <- a1) {
println(elem)
}
}
}
}
List
不可变List
- 说明
(1)List默认为不可变集合
(2)创建一个List(数据有顺序,可重复)
(3)遍历List
(4)List增加数据
(5)集合间合并:将一个整体拆成一个一个的个体,称为扁平化
(6)取指定数据
(7)空集合Nil - 案例实操
package com.gc.scala.day05.list
/**
* Author guochao
* Date 2021/5/8 16:19
*/
object List1 {
def main(args: Array[String]): Unit = {
//1.创建有元素的集合
val l1=List(1,2,3)
println(l1)
//2.空list
val l2=List[Int]()
//3.空集合
val l3=Nil
//4.向List添加元素
val l4=200+: l1 :+ 100
val l5=200::100::l1
val l6=List(6,6,6,6)
val l7=l6:::l1//合并
}
}
/*
List
就是列表
默认不可变
不可变List专用
:: 等同于 +: 在前面添加元素
::: 合并两个List
*/
可变List
package com.gc.scala.day05.list
import scala.collection.mutable.ListBuffer
/**
* Author guochao
* Date 2021/5/8 16:28
*/
object ListBuffer1 {
def main(args: Array[String]): Unit = {
val buffer=ListBuffer(1,2,3)//可变List
buffer+=10
100+=:buffer
println(buffer)
}
}
Set
不可变Set
- 说明
(1)Set默认是不可变集合,数据无序
(2)数据不可重复
(3)遍历集合 - 案例实操
package com.gc.scala.day05.Set
/**
* Author guochao
* Date 2021/5/8 16:34
*/
object Set1 {
def main(args: Array[String]): Unit = {
//不可变集合
/*val set1 = Set(1, 2, 3, 4, 5, 6)
val set2=set1+10
println(set1)*/
val set1 = Set(1, 2, 3, 4, 5, 6)
val set2 = Set(45,34,78,32)
val set3=set1++set2
val set4=set1 | set2
val set5=set1 union set2
val set6=set1 & set2
val set7=set1 intersect(set2)
val set8=set1 &~ set2 //减去共同部分
}
}
/*
Set
可变和不可变,默认不可变
不可重复,无序
其实就是代数里的集合
并集
|
++
union
交集:& intersect
差集:&~
*/
object TestSet {
def main(args: Array[String]): Unit = {
//(1)Set默认是不可变集合,数据无序
val set = Set(1,2,3,4,5,6)
//(2)数据不可重复
val set1 = Set(1,2,3,4,5,6,3)
//(3)遍历集合
for(x<-set1){
println(x)
}
}
}
可变Set(mutable.Set)
package com.gc.scala.day05.Set
import scala.collection.mutable
/**
* Author guochao
* Date 2021/5/8 16:44
*/
object Set2 {
def main(args: Array[String]): Unit = {
val set1=mutable.Set(10,20,30)
set1+=100
println(set1)
//使用set去重
val list1=List(30,20,50,30,30)
val list2=list1.toSet.toList
println(list2)
}
}
object TestSet {
def main(args: Array[String]): Unit = {
//(1)创建可变集合
val set = mutable.Set(1,2,3,4,5,6)
//(3)集合添加元素
set += 8
//(4)向集合中添加元素,返回一个新的Set
val ints = set.+(9)
println(ints)
println("set2=" + set)
//(5)删除数据
set-=(5)
//(2)打印集合
set.foreach(println)
println(set.mkString(","))
}
}
Map
不可变Map
package com.gc.scala.day05.Map
/**
* Author guochao
* Date 2021/5/8 16:49
*/
object Map1 {
def main(args: Array[String]): Unit = {
val map1= Map[String,Int](("a",97),("b",98),("c",99))
for (elem <- map1) {
println(elem)
println(elem._1)
}
}
}
/*
Map映射
默认不可变,具体的实现是HashMap
scala中的Map,把键和值当作元组来处理
*/
package com.gc.scala.day05.Map
/**
* Author guochao
* Date 2021/5/8 16:56
*/
object Map2 {
def main(args: Array[String]): Unit = {
val map1=Map("a"->1, "b"->2, "c"->3)
println(map1)
val map2= map1+("f" ->102)
println(map2)
val map3=map1++map2//合并
}
}
package com.gc.scala.day05.Map
/**
* Author guochao
* Date 2021/5/8 17:01
*/
object Map3 {
def main(args: Array[String]): Unit = {
val map1=Map("a"->1, "b"->2, "c"->3)
//根据key获取值
val v1=map1("a")
println(v1)
}
}
可变Map
package com.gc.scala.day05.Map
import scala.collection.mutable
/**
* Author guochao
* Date 2021/5/8 17:02
*/
object Map4 {
def main(args: Array[String]): Unit = {
val map1=mutable.Map("a"->1, "b"->2, "c"->3)//可变Map
map1+=("aa"->100)
println(map1)
map1.update("aa",233)//更新Map
println(map1)
}
}
object TestSet {
def main(args: Array[String]): Unit = {
//(1)创建可变集合
val map = mutable.Map( "a"->1, "b"->2, "c"->3 )
//(3)向集合增加数据
map.+=("d"->4)
// 将数值4添加到集合,并把集合中原值1返回
val maybeInt: Option[Int] = map.put("a", 4)
println(maybeInt.getOrElse(0))
//(4)删除数据
map.-=("b", "c")
//(5)更新数据
map.update("d",5)
//(2)打印集合
map.foreach((kv)=>{println(kv)})
}
}
元组
- 说明
元组也是可以理解为一个容器,可以存放各种相同或不同类型的数据。说的简单点,就是将多个无关的数据封装为一个整体,称为元组。
注意:元组中最大只能有22个元素。 - 案例实操
(1)声明元组的方式:(元素1,元素2,元素3)
(2)访问元组
(3)Map中的键值对其实就是元组,只不过元组的元素个数为2,称之为对偶
object TestTuple {
def main(args: Array[String]): Unit = {
//(1)声明元组的方式:(元素,元素2,元素3)
val tuple: (Int, String, Boolean) = (40,"bobo",true)
//(2)访问元组
//(2.1)通过元素的顺序进行访问,调用方式:_顺序号
println(tuple._1)
println(tuple._2)
println(tuple._3)
//(2.2)通过索引访问数据
println(tuple.productElement(0))
//(2.3)通过迭代器访问数据
for (elem <- tuple.productIterator) {
println(elem)
}
//(3)Map中的键值对其实就是元组,只不过元组的元素个数为2,称之为对偶
val map = Map("a"->1, "b"->2, "c"->3)
map.foreach(tuple=>{println(tuple._1 + "=" + tuple._2)})
}
}
集合基本属性和常用操作
- 说明
(1)获取集合长度
(2)获取集合大小
(3)循环遍历
(4)迭代器
(5)生成字符串
(6)是否包含 - 案例实操
object TestList {
def main(args: Array[String]): Unit = {
val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7)
//(1)获取集合长度
println(list.length)
//(2)获取集合大小
println(list.size)
//(3)循环遍历
list.foreach(println)
//(4)迭代器
for (elem <- list.iterator) {
println(elem)
}
//(5)生成字符串
println(list.mkString(","))
//(6)是否包含
println(list.contains(3))
}
}
衍生集合
- 说明
(1)获取集合的头head
(2)获取集合的尾(不是头就是尾)tail
(3)集合最后一个数据 last
(4)集合初始数据(不包含最后一个)
(5)反转
(6)取前(后)n个元素
(7)去掉前(后)n个元素
(8)并集
(9)交集
(10)差集
(11)拉链
(12)滑窗 - 案例实操
object TestList {
def main(args: Array[String]): Unit = {
val list1: List[Int] = List(1, 2, 3, 4, 5, 6, 7)
val list2: List[Int] = List(4, 5, 6, 7, 8, 9, 10)
//(1)获取集合的头
println(list1.head)
//(2)获取集合的尾(不是头的就是尾)
println(list1.tail)
//(3)集合最后一个数据
println(list1.last)
//(4)集合初始数据(不包含最后一个)
println(list1.init)
//(5)反转
println(list1.reverse)
//(6)取前(后)n个元素
println(list1.take(3))
println(list1.takeRight(3))
//(7)去掉前(后)n个元素
println(list1.drop(3))
println(list1.dropRight(3))
//(8)并集
println(list1.union(list2))
//(9)交集
println(list1.intersect(list2))
//(10)差集
println(list1.diff(list2))
//(11)拉链 注:如果两个集合的元素个数不相等,那么会将同等数量的数据进行拉链,多余的数据省略不用
println(list1.zip(list2))
//(12)滑窗
list1.sliding(2, 5).foreach(println)
}
}
集合计算初级函数
- 说明
(1)求和
(2)求乘积
(3)最大值
(4)最小值
(5)排序 - 实操
object TestList {
def main(args: Array[String]): Unit = {
val list: List[Int] = List(1, 5, -3, 4, 2, -7, 6)
//(1)求和
println(list.sum)
//(2)求乘积
println(list.product)
//(3)最大值
println(list.max)
//(4)最小值
println(list.min)
//(5)排序
// (5.1)按照元素大小排序
println(list.sortBy(x => x))
// (5.2)按照元素的绝对值大小排序
println(list.sortBy(x => x.abs))
// (5.3)按元素大小升序排序
println(list.sortWith((x, y) => x < y))
// (5.4)按元素大小降序排序
println(list.sortWith((x, y) => x > y))
}
}
集合计算高级函数
- 说明
(1)过滤
(2)转化/映射
(3)扁平化
(4)扁平化+映射 注:flatMap相当于先进行map操作,在进行flatten操作
(5)分组
(6)简化(规约)
(7)折叠 - 实操
object TestList {
def main(args: Array[String]): Unit = {
val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
val nestedList: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
val wordList: List[String] = List("hello world", "hello atguigu", "hello scala")
//(1)过滤
println(list.filter(x => x % 2 == 0))
//(2)转化/映射
println(list.map(x => x + 1))
//(3)扁平化
println(nestedList.flatten)
//(4)扁平化+映射 注:flatMap相当于先进行map操作,在进行flatten操作
println(wordList.flatMap(x => x.split(" ")))
//(5)分组
println(list.groupBy(x => x % 2))
}
}
- Reduce方法
Reduce简化(规约) :通过指定的逻辑将集合中的数据进行聚合,从而减少数据,最终获取结果。
案例实操
object TestReduce {
def main(args: Array[String]): Unit = {
val list = List(1,2,3,4)
// 将数据两两结合,实现运算规则
val i: Int = list.reduce( (x,y) => x-y )
println("i = " + i)
// 从源码的角度,reduce底层调用的其实就是reduceLeft
//val i1 = list.reduceLeft((x,y) => x-y)
// ((4-3)-2-1) = -2
val i2 = list.reduceRight((x,y) => x-y)
println(i2)
}
}
4.Fold方法
Fold折叠:化简的一种特殊情况。
(1)案例实操:fold基本使用
object TestFold {
def main(args: Array[String]): Unit = {
val list = List(1,2,3,4)
// fold方法使用了函数柯里化,存在两个参数列表
// 第一个参数列表为 : 零值(初始值)
// 第二个参数列表为:
// fold底层其实为foldLeft
val i = list.foldLeft(1)((x,y)=>x-y)
val i1 = list.foldRight(10)((x,y)=>x-y)
println(i)
println(i1)
}
}
(2)案例实操:两个集合合并
object TestFold {
def main(args: Array[String]): Unit = {
// 两个Map的数据合并
val map1 = mutable.Map("a"->1, "b"->2, "c"->3)
val map2 = mutable.Map("a"->4, "b"->5, "d"->6)
val map3: mutable.Map[String, Int] = map2.foldLeft(map1) {
(map, kv) => {
val k = kv._1
val v = kv._2
map(k) = map.getOrElse(k, 0) + v
map
}
}
println(map3)
}
}
队列
package com.gc.scala.day05.queue
import scala.collection.mutable
/**
* Author guochao
* Date 2021/5/8 17:08
*/
object Queue1 {
def main(args: Array[String]): Unit = {
val q1=mutable.Queue[Int](10,20,30)
q1.enqueue(100,200)//添加在尾部 入队
println(q1)
q1.dequeue()//删除最前面的 出队
println(q1)
val s1=mutable.Stack[Int](10,20,30)
val p=s1.pop()
println(p)
s1.push(100)
val p2=s1.pop()
println(p2)//10
}
}
/*
队列
入队
出队
栈
push 入栈
pop 出栈
*/