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.Queue
和scala.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