第 10 章 数据结构 之 集合(下)

一、队列(Queue)

1、Queue的基本介绍

队列的说明

1. 队列是一个有序列表,在底层可以用数组或是链表来实现;
2. 其输入和输出要遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出;
3. 在Scala中,由设计者直接给我们提供队列类型使用;
4. 在scala中, 有scala.collection.mutable.Queue和scala.collection.immutable.Queue, 一般来说,我们在开发
中通常使用可变集合(scala.collection.mutable.Queue)中的队列。 
2、Queue的基本使用

示例代码:

package com.lj.scala.Gather

import scala.collection.mutable

object GatherTest13 {

    def main(args: Array[String]): Unit = {

        /**
          * 说明:队列的创建(默认是可变的)
          * 1. val q01 = new mutable.Queue[Int]() 或者 val q01 = mutable.Queue[Int]();
          * 2. [Int]: 说明队列的泛型类型是Int,要想放多种类型的数据可以设置泛型是Any;
          */

        val q01 = new mutable.Queue[Int]()  // 创建空的队列,()可以不带
        println("空的队列q01:" + q01)   // Queue()

        /**
          * 说明:向队列中追加单个元素和List(默认直接加在队列的后面)
          * 1. q02 += 5   // 用 “+=” 符号向队列中添加单个元素;
          * 2. 向队列中添加列表List(默认直接加在队列的后面)
          *     a): 通过‘++=’符号向队列中添加列表,此时对队列的泛型没有要求!
          *     b): 通过‘+=’符号向队列中添加列表,此时队列的泛型必须为Any才OK!
          *         而且加入队列中的元素是一个List列表
          */

        // 创建一个新的队列
        val q02 = new mutable.Queue[Any]
        q02 += 5   // 向队列中添加单个元素
        q02 += "Tom"
        println("通过‘+=’符号向队列中添加元素的结果:" + q02)

        // 方式1:向队列中添加列表List
        q02 ++= List(true, 2, "Jack")
        println("方式1通过‘++=’符号向队列中添加列表的结果:" + q02)
        // 方式2:向队列中添加列表List
        q02 += List("Leo", false, 4, 7)   // 此时队列的泛型是Any才OK,否则报错!!!
        println("方式2通过‘+=’符号向队列中添加列表的结果:" + q02)

        println("------------------华丽的分隔符-----------------------")

        /**
          * 说明:删除队列
          * 1. 按照进入队列的顺序删除元素(队列先进先出),即入队列的数据放在队尾,出队列的数据是队列的头部!
          *     val q02_ele01 = q02.dequeue()  // 删除队列的头部元素
          *     q02.enqueue(100, "Jack", q01)  // 向队列中添加元素
          */

        println("q02队列的数据:" + q02)

        // dequeue:从队列q02的头部取出元素并删除,同时q02本身也会变化
        val q02_ele01 = q02.dequeue()
        println("队列取出的第一个元素:" + q02_ele01)
        println("队列取出元素之后q02队列中剩余的元素:" + q02)

        // 按照队列的算法,会将数据添加到队列的尾部
        val q03 = new mutable.Queue[Int]()
        q03 ++= List(1, 2, 4, 12, 45)
        q02.enqueue(100, "Jack", q03)
        println("队列添加元素之后q02队列中的元素:" + q02)

        println("------------------华丽的分隔符-----------------------")

        /**
          * 说明:队列的返回(队列的本身没有变化)
          * 1. val q02_head = q02.head  // 返回队列的第一个元素
          * 2. val q02_last = q02.last  // 返回队列最后一个元素
          * 3. val q02_tail = q02.tail  // 返回队列的尾部
          *    即:返回除了第一个以外剩余的元素, 可以级联使用,这个在递归时使用较多
          *    例如:q02.tail.tail
          *
          */

        val q02_head = q02.head
        println("q02队列的第一个元素:" + q02_head)
        val q02_last = q02.last
        println("q02队列的最后一个元素:" + q02_last)
        val q02_tail = q02.tail
        println("返回q02队列除了第一个元素以外的所有元素:" + q02_tail)

    }

}
======================运行结果================================
空的队列q01:Queue()
通过‘+=’符号向队列中添加元素的结果:Queue(5, Tom)
方式1通过‘++=’符号向队列中添加列表的结果:Queue(5, Tom, true, 2, Jack)
方式2通过‘+=’符号向队列中添加列表的结果:Queue(5, Tom, true, 2, Jack, List(Leo, false, 4, 7))
------------------华丽的分隔符-----------------------
q02队列的数据:Queue(5, Tom, true, 2, Jack, List(Leo, false, 4, 7))
队列取出的第一个元素:5
队列取出元素之后q02队列中剩余的元素:Queue(Tom, true, 2, Jack, List(Leo, false, 4, 7))
队列添加元素之后q02队列中的元素:Queue(Tom, true, 2, Jack, List(Leo, false, 4, 7), 100, Jack, Queue(1, 2, 4, 12, 45))
------------------华丽的分隔符-----------------------
q02队列的第一个元素:Tom
q02队列的最后一个元素:Queue(1, 2, 4, 12, 45)
返回q02队列除了第一个元素以外的所有元素:Queue(true, 2, Jack, List(Leo, false, 4, 7), 100, Jack, Queue(1, 2, 4, 12, 45))
======================运行结果================================

二、映射(Map)

1、Map的基本介绍

Java中的Map回顾

1. HashMap是一个散列表(数组+链表),它存储的内容是键值对(key-value)映射,Java中的HashMap是无序
的,key不能重复。

Scala中的Map介绍

1. Scala中的Map和Java类似,也是一个散列表,它存储的内容也是键值对(key-value)映射,Scala中不可变的
Map是有序的,可变的Map是无序的;
2. Scala中,有可变Map (scala.collection.mutable.Map) 和 不可变Map(scala.collection.immutable.Map)。
2、Map的构建

示例代码:

package com.lj.scala.Gather

object GatherTest14 {

    def main(args: Array[String]): Unit = {

        /**
          * 说明:Map构建方式一:构造不可变映射(默认是不可变的映射)
          * 1. Scala中的不可变Map是有序,构建Map中的元素底层是Tuple2类型。
          *
          * 2. 构造不可变映射小结
          *     a).从输出的结果看到,输出顺序和声明顺序一致;
          *     b).构建Map集合中,集合中的元素其实是Tuple2类型;
          *     c).默认情况下(即没有引入其它包的情况下),Map是不可变map.
          */

        val immutable_map01 = Map("Jack" -> 25, "Alice" -> 30)
        // 下面输出结果:不可变元素immutable_map01:Map(Jack -> 25, Alice -> 30)
        println("不可变元素immutable_map01:" + immutable_map01)

        println("-----------------华丽分隔符--------------------")

        /**
          * 说明:Map构建方式二:构造可变映射
          * 1. Scala中的可变Map是无序的,构建Map中的元素底层是Tuple2类型。
          *
          * 2. 构造可变映射小结
          *     a). 从输出的结果看到,输出顺序和声明顺序不一致.
          */

        val mutable_map01 = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> 30)
        // 输出结果:可变元素mutable_map01:Map(Bob -> 20, Kotlin -> 30, Alice -> 10)
        println("可变元素mutable_map01:" + mutable_map01)

        println("-----------------华丽分隔符--------------------")

        /**
          * 说明:Map构建方式三:创建空的Map映射
          * 1. val map02 = new mutable.HashMap[String, Int]{}  // 创建空的映射Map需要指定key-value的类型
          */

        val map02 = new mutable.HashMap[String, Int]{}  // {}可带可不带
        println("创建空的映射:" + map02)

        println("-----------------华丽分隔符--------------------")

        /**
          * 说明:对偶元组
          * 1. 即:创建包含键值对的二元组, 和第一种方式等价,只是形式上不同而已;
          * 2. 对偶元组 就是只含有两个数据的元组。
          */
		
		// 创建对偶元组需要导入包:import scala.collection.mutable
		import scala.collection.mutable
        val map03 = mutable.Map(("Jack", 16), ("Tom", 15), ("Leo", 20))
        println("对偶元组map03:" + map03)
        // 创建空的对偶元组
        val map04 = mutable.Map()
        println("空的对偶元组map04:" + map04)

    }

}
======================运行结果================================
不可变元素immutable_map01:Map(Jack -> 25, Alice -> 30)
-----------------华丽分隔符--------------------
可变元素mutable_map01:Map(Bob -> 20, Kotlin -> 30, Alice -> 10)
-----------------华丽分隔符--------------------
创建空的映射:Map()
-----------------华丽分隔符--------------------
对偶元组map03:Map(Tom -> 15, Jack -> 16, Leo -> 20)
空的对偶元组map04:Map()
======================运行结果================================
3、Map的操作

示例代码:

package com.lj.scala.Gather

object GatherTest15 {

    def main(args: Array[String]): Unit = {

        /**
          * 映射Map的取值方式一:
          * 1. 使用map(key)取值
          * 小结:
          *     a). 如果key存在,则返回对应的值
          *     b). 如果key不存在,则抛出异常[java.util.NoSuchElementException]
          *     c). 在Java中,如果key不存在则返回null
          *
          */

        // 创建一个Map映射
        val map01 = scala.collection.mutable.Map[String, Int]("Jack" -> 20, "Tom" -> 19)
        // 通过key取value值
        val value01 = map01("Tom")
        println("key值Tom对应的value01值:" + value01)
        // val value02 = map01("Alice")  // java.util.NoSuchElementException: key not found: Alice

        /**
          * 映射Map的取值方式二:
          * 1. 使用contains方法检查是否存在key
          *     a). 如果key存在,则返回true.
          *     b). 如果key不存在,则返回false.
          *
          * 说明:使用containts先判断在取值,可以防止异常,并加入相应的处理逻辑
          */

        var value02: Int = 0

        if (map01.contains("Alice")) {
            value02 = map01("Alice")
        } else {
            println("映射map01中的key值Alice不存在!!!")
            value02 = map01("Jack")
        }
        println("映射Map通过contains方式取值结果:" + value02)

        /**
          * 映射Map的取值方式三:
          * 1. 使用map.get(key).get取值
          * 说明:通过“映射.get(键)”这样的调用返回一个Option对象,要么是Some,要么是None
          *
          * 小结:
          *     a). map.get(key)方法会将数据进行包装成Option对象;
          *     b). 如果 map.get(key) key存在返回some,如果key不存在,则返回None;
          *     c). 如果 map.get(key).get  key存在,返回key对应的值,
          *         否则,抛出异常 java.util.NoSuchElementException: None.get.
          *
          */

        // 创建对偶元组
        import scala.collection.mutable
        val map02 = mutable.Map(("上海", "复旦"), ("安徽", "少年科技大"), ("北京", "北大"), ("吉林", "吉林大学"))
        val map02_value01_some = map02.get("上海")  // 取到的值是Some(复旦)
        println("map02_value01_some:" + map02_value01_some)
        val map02_value01 = map02_value01_some.get  // 得到Some再取值,从而取到的是具体的值
        println("map02_value01:" + map02_value01)  // 复旦
        // map02.get("武汉").get   // java.util.NoSuchElementException: None.get

        /**
          * 映射Map的取值方式三:
          * 1. 使用map4.getOrElse()取值;
          * 2. getOrElse 方法 : def getOrElse[V1 >: V](key: K, default: => V1)
          * 说明:
          *     a). 如果key存在,返回key对应的值;
          *     b). 如果key不存在,返回默认值,在java中底层有很多类似的操作。
          */

        val map02_value02 = map02.getOrElse("北京", "清华")
        println("map02_value02:" + map02_value02)
        val map02_value03 = map02.getOrElse("四川", "成都大学")
        println("map02_value03:" + map02_value03)

        /**
          * 如何选择取值方式:
          * 1. 如果我们确定map有这个key ,则应当使用map(key), 速度快;
          * 2. 如果我们不能确定map是否有key ,而且有不同的业务逻辑,使用map.contains() 先判断在加入逻辑;
          * 3. 如果只是简单的希望得到一个值,使用map4.getOrElse("四川", "成都大学")
          */

        println("----------------------华丽分隔符------------------------")

        println("当前map01的值:" + map01)

        /**
          * 映射Map的修改:
          * 说明:
          *     a). map是可变的,才能修改,否则报错;
          *     b). 如果key存在,则修改对应的值、key不存在,等价于添加一个key-val.
          *
          */

        map01("Tom") = 15
        map01("Leo") = 17
        println("map01的值:" + map01)

        /**
          * 1. 添加映射Map的元素方式一:增加单个元素
          *    说明:如果key存在,则修改对应的值、key不存在,等价于添加一个key-val
          *
          * 2. 添加映射Map的元素方式一:增加多个元素
          *    说明:如果key存在,则修改对应的值、key不存在,等价于添加一个key-val
          *
          */

        map01 += ("Alice" -> 16)
        map01 += ("Tom" -> 21)
        println("增加单个元素之后map01的值:" + map01)

        val map03 = map01 + ("MaLi" -> 22, "Alex" -> 23, "Tom" -> 26)
        println("增加多个元素之后map03的值1:" + map03)

        map01 += ("Rose" -> 23, "Marry" -> 30, "Tony" -> 19, "Tom" -> 29)
        println("增加多个元素之后map01的值:" + map01)
        println("增加多个元素之后map03的值2:" + map01)

        /**
          * 删除Map元素:map01 -= ("Rose", "Tom", "Seven")
          * 说明:
          *     1. "Rose", "Tom" 就是要删除的key, 可以写多个;
          *     2. 如果key存在,就删除,如果key不存在,也不会报错.
          *
          */

        map01 -= ("Rose", "Tom", "Seven")
        println("删除map01元素之后的值:" + map01)

        /**
          * Map元素的遍历:对map的元素(元组Tuple2对象 )进行遍历的方式很多种。
          *
          * 例如:
          * for ((k, v) <- map01) println(k + " is mapped to " + v)
          * for (v <- map01.keys) println(v)
          * for (v <- map01.values) println(v)
          * for(v <- map01) println(v) //v是Tuple?
          *
          * 说明:
          *     1. 每遍历一次,返回的元素是Tuple2;
          *     2. 取出的时候,可以按照元组的方式来取。
          */

        // 遍历方式一:
        for ((k, v) <- map01) {
            println(k + " is mapped to " + v)
        }
        
    }

}
======================运行结果================================
key值Tom对应的value01值:19
映射map01中的key值Alice不存在!!!
映射Map通过contains方式取值结果:20
map02_value01_some:Some(复旦)
map02_value01:复旦
map02_value02:北大
map02_value03:成都大学
----------------------华丽分隔符------------------------
当前map01的值:Map(Tom -> 19, Jack -> 20)
map01的值:Map(Tom -> 15, Jack -> 20, Leo -> 17)
增加单个元素之后map01的值:Map(Tom -> 21, Jack -> 20, Alice -> 16, Leo -> 17)
增加多个元素之后map03的值1Map(Alex -> 23, Jack -> 20, Tom -> 26, Alice -> 16, MaLi -> 22, Leo -> 17)
增加多个元素之后map01的值:Map(Marry -> 30, Tom -> 29, Jack -> 20, Alice -> 16, Tony -> 19, Rose -> 23, Leo -> 17)
增加多个元素之后map03的值2Map(Marry -> 30, Tom -> 29, Jack -> 20, Alice -> 16, Tony -> 19, Rose -> 23, Leo -> 17)
删除map01元素之后的值:Map(Marry -> 30, Jack -> 20, Alice -> 16, Tony -> 19, Leo -> 17)
Marry is mapped to 30
Jack is mapped to 20
Alice is mapped to 16
Tony is mapped to 19
Leo is mapped to 17
======================运行结果================================

三、集(Set)

1、Set的基本介绍
集是不重复元素的结合。集不保留顺序,默认是以哈希集实现。

Java中Set的回顾

	Java中,HashSet是实现Set<E>接口的一个实体类,数据是以哈希表的形式存放的,里面的不能包含重复
数据。Set接口是一种不包含重复元素的collection,HashSet中的数据也是没有顺序的。 
	
	示例:
		HashSet hs = new HashSet<String>();
		hs.add("jack");
		hs.add("tom");
		hs.add("jack");
		hs.add("jack2");
		System.out.println(hs);

Scala中Set的说明

默认情况下,Scala使用的是不可变集合,如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包
2、Set的操作

示例代码:

package com.lj.scala.Gather

object GatherTest16 {

    def main(args: Array[String]): Unit = {

        /**
          * 集Set创建:
          * 1. 默认是不可变Set集合
          * 2. 创建可变的Set集合,需要先导入包:import scala.collection.mutable.Set
          */

        // 创建Set不可变集合
        val immutable_set = Set(1, 3, 5, 19)  // 不可变
        println("不可变集immutable_set:" + immutable_set)

        // 创建Set可变集合
        import scala.collection.mutable.Set
        val mutable_set = Set(4, 6, 10, 13)
        println("可变集mutable_set:" + mutable_set)

        /**
          * 集Set--可变集合的元素添加:
          * 1. Set集合添加元素,首先这个Set集合必须是可变
          * 2. 如果添加的对象已经存在,则不会重复添加,也不会报错
          *
          * Set集合添加元素方式有三种:
          * 1. // 添加元素方式1:
          *     mutable_set.add(9)
          * 2. // 添加元素方式2:
          *     mutable_set += 11
          * 3. // 添加元素方式3:
          *     mutable_set.+= (6, 10, 12)   // 可以添加多个元素
          */

        // 添加元素方式1:
        mutable_set.add(9)
        // 添加元素方式2:
        mutable_set += 11
        // 添加元素方式3:
        mutable_set.+= (6, 10, 12)
        println("添加元素之后的mutable_set集合:" + mutable_set)

        /**
          * 集Set--可变集合的元素删除:
          *
          * Set集合删除元素的方式有两种:
          * 1. // 删除Set集合中的元素方式1:
          *     mutable_set -= 11
          * 2. // 删除Set集合中的元素方式2:
          *     mutable_set.remove(10)  // 方法的形式直接删除Set集合中元素
          *
          * 说明:如果删除的对象不存在,则不生效,也不会报错
          *
          */

        // 删除Set集合中的元素方式1:
        mutable_set -= 11
        // 删除Set集合中的元素方式2:
        mutable_set.remove(10)  // 方法的形式直接删除Set集合中元素
        println("删除元素之后mutable_set集合的值:" + mutable_set)

        /**
          * Set集合的遍历
          */

        for (ele <- mutable_set) {
            println("mutable_set集合中的元素:" + ele)
        }

    }

}
======================运行结果================================
不可变集immutable_set:Set(1, 3, 5, 19)
可变集mutable_set:Set(13, 6, 10, 4)
添加元素之后的mutable_set集合:Set(12, 9, 13, 6, 10, 4, 11)
删除元素之后mutable_set集合的值:Set(12, 9, 13, 6, 4)
mutable_set集合中的元素:12
mutable_set集合中的元素:9
mutable_set集合中的元素:13
mutable_set集合中的元素:6
mutable_set集合中的元素:4
======================运行结果================================

Set集合的其他操作一览:
Set集合操作

对以前的知识回顾,加深基础知识!
学习来自:北京尚硅谷韩顺平老师—尚硅谷大数据技术之Scala
每天进步一点点,也许某一天你也会变得那么渺小!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值