为了账号安全,请及时绑定邮箱和手机立即绑定

Scala(七)-②-数据结构-集合-Queue-Map-Set

标签:
Spark

Queue

① Why

为什么学习队列?其一,队列对应显示生活中很多场景,知队列,写程序才能用队列模拟.其二,队列有很多实际的应用场景,如利用优先队列, 获取商品销量的前10名,我们只要让优先队列按照销量为优先级,销量高者位于队尾,固定队列大小为10,即可以实时维护获取前10名.

② How

    val q = mutable.Queue[Any]()
    print(q)
增删
增-单个-向队列添加元素
    // 2.添加元素
    q += 1
    println(q)
增删-单个-出入队列
  // 3.出入队列
    // 3.1 出, 对头出
    val n = q.dequeue()
    println("dequeue q = " + q, "val = " + n)    // 3.2 入, 队尾入队列
    q.enqueue(6)
    println("q = " + q)
增-批量-添加多个元素
   // 2.1添加集合中多个元素
    q ++= List(4, 3, 2)
    println(q)
增-集合-将集合作为元素添加
  // 2.2将集合视为元素添加
    q += List(4,3,2)
    println(q)
   // 4.获取队列的头尾元素,不会改变队列本身
    println("q head = " + q.head)
    println("q last = " + q.last)
    println("q = " + q)    // tail 返回第一个元素以外的剩余元素
    println(q.tail.tail.tail)

③ What

队列是一个有序列表, 在底层可以用数组或是链表来实现.用数组的话可以将队列建成环向队列.用链表,可以分别用在头节点中维护头尾指针.

④ Details

  • 其输入和输出要遵循先入先出的原则。即:先存入队列的数据,要先取出.后存入的要后取

  • 在scala中,由设计者直接给我们提供队列类型Queue使用.

  • 在scala中,有scala.collection.mutable.Queuescala.collection.immutable.Queue, 一般来说,我们在开发中通常使用可变集合中的队列

Map

① Why

  • Map是什么重要的一种数据结构.我们可以用Map来做缓存,实现快速的存取数据.

② How

创建Map的四中方式
  • 构建不可变的Map
    代码

val map1 = Map("Alice" -> 10, "Bob" -> 20, "City" -> "北京")
println(map1)
  • 构建可变的Map

val map2 = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 20, "City" -> "北京")
println(map2)
  • 构建一个空的map

val map3 = new  scala.collection.mutable.HashMap[String, Int]
println(map3)
  • 对偶元组方式创建

val map4 = scala.collection.mutable.Map(("Alice", 10), ("Bob", 20), ("City" , "北京"))
println(map4)
查-map中的元素
方式一-括号方式访问
  • 如果元素不存在抛出异常.

  • 这和Java不一样,Java中的map不存在返回null.

scala> map4("City")
res11: Any = 北京

scala> map4("City1")
java.util.NoSuchElementException: key not found: City1
  at scala.collection.MapLike$class.default(MapLike.scala:228)
  at scala.collection.AbstractMap.default(Map.scala:59)
  at scala.collection.mutable.HashMap.apply(HashMap.scala:65)
  ... 32 elided
方式二-使用contains方法判断
scala> val key = "City1"key: String = City1scala> if (map4.contains(key)) {
     |     println("key存在,值=" + map4(key))
     | }else {
     |     println("key不存在")
     | }
key不存在
方式三-使用get方法
val some = map4.get("City")if (some != None)
    println(some.get, "some's class = " + some.getClass())
方法四-getOrElse(key, default)

如果对应key不存在返回默认值

val city = map4.getOrElse("City1", "beijing")
println(city)
选择方法总结
  • 如果我们确定Map有对应的key,则应该使用map(key),效率最高

  • 如果我们不能确定Map是否有key,而且有不同的业务逻辑,使用map.contains(key)

  • 如果只是简单的希望得到一个值,使用map.getOrElse()

改-修改map中的元素
  • map是可变的才能修改,否则报错

  • 如果有key就更新,如果没key就添加

map4("City")="quanzhou"println(map4)
增-向map中添加元素
方式一:使用+=添加
scala> map4 += ("name"->"Mr.su")
res23: map4.type = Map(Bob -> 20, name -> Mr.su, Alice -> 10)

scala> map4 += ("City"->"Beijing")
res24: map4.type = Map(Bob -> 20, City -> Beijing, name -> Mr.su, Alice -> 10)

scala> println(map4)Map(Bob -> 20, City -> Beijing, name -> Mr.su, Alice -> 10)
删-删除map中的元素
使用-=运算符
scala> map4 -= ("name", "City")
res21: map4.type = Map(Bob -> 20, Alice -> 10)

scala> println(map4)Map(Bob -> 20, Alice -> 10)
遍历-map中的4中遍历
方式一-取(k,v)
for ((k,v) <- map4) {
    println(s"key=${k}, value=${v}")
}
方式二-取key
for (k <- map4.keys) {
    println(s"key=${k}, value=${map4(k)}")
}
方式三-取value
for (v <- map4.values) {
    println(v)
}
方式四-取元组
for (e <- map4) {
    println("key=" + e._1, "value=" + e._2)
}

③ What

  • HashMap 是一个散列表(数组+链表)

④ Details

  • 创建的Map, 默认是不可变的(Immutable),所以不用导入.

  • 不可变的Map有序的.输出顺序声明顺序一样.

  • Map的每一对k,v底层是Tuple2

Set

① Why

当我们需要存储不可重复的元素,可以使用Set.

② How

创建

创建不可变set
val s = Set(1,2,3)
println(s)
创建可变set
val mset = scala.collection.mutable.Set(1,2,3, "Hello")
println(mset)

添加

可变set集合的添加
mset += 4println(mset)
mset.add(5)
println(mset)
mset.+=(6)
println(mset)

删除

可变set集合的删除,按照值删除
mset -= 2println(mset)
mset.remove("Hello")
println(mset)
mset.remove("Nothing")
println(mset)

遍历

for(item <- map4) {
    println(item)
}



作者:sixleaves
链接:https://www.jianshu.com/p/313dc1219ab9


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消