Scala(七)-②-数据结构-集合-Queue-Map-Set
2018-11-20 本文已影响5人
sixleaves
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 = City1
scala> 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 += 4
println(mset)
mset.add(5)
println(mset)
mset.+=(6)
println(mset)
删除
可变set集合的删除,按照值删除
mset -= 2
println(mset)
mset.remove("Hello")
println(mset)
mset.remove("Nothing")
println(mset)
遍历
for(item <- map4) {
println(item)
}