Scala之哈希表使用探究

Scala之哈希表使用探究

        一个经典的程序员名言是:“如果只能用一种数据结构,那就用哈希表吧。”哈希表,更笼统的说,映射--是最灵活的数据结构之一。

       下面介绍神奇的Scala对Map的使用

一、构造映射
    1.构造不可变映射
    

 val scores=Map("Alice"->10,"Bob"->8,"City"->5)

 
     上述代码构造出一个不可变的Map[String,Int],其值不能不被改变(不能添加、不能更新值)
    2.构造可变映射
     

 val scores=scala.collection.mutable.Map("Alice"->10,"Bob"->8,"City"->5)

 
    3.构造一个空的映射
     

 val scores=new scala.collection.mutable.HashMap[String,Int]

 
    4.使用对偶定义映射
    

   val scores=Map(("Alice",10),("Bob",8),("City",5))

 
二、操作映射
    1.获取映射中的值
    

   val BobScores=scores("Bob")

 
     但是如果汀射中不包含请求中使用的键,则会抛出异常
     所以我们在取值之前可以用contains方法来查看映射中是否含有指定的键
    

 val BobScores=if(scores.contains("Bob"))scores("Bob") else 0

 
      当然可以使用以下比较快捷的方式
   

  val BobScores=scores.getOrElse("Bob",0)
  val BobScores=scores.get("Bob")

 
      这样的调用返回一个Option对象,要么是Some(键对应的值),要么是None

    2.在映射中添加或者更新关系
      

    scores("EE")=10
    scores("Bob")=10

 
      更新或者添加多个关系
     

 scores+=("AA"->10,"BB"->8,"CC"->5)

 
       移除映射中的关系
    

  scores-="Bob"

 
      
       我们不更更新不可变数组但是我们可以获得一个需要更新的心的映射
       

         val tmp = Map("Alice" -> 10, "Bob" -> 8, "City" -> 5)
         val combine = tmp + ("Alice" -> 10, "XX" -> 8)
         val remove = combine - "Alice"
         println(combine.mkString("、"))
         println(remove.mkString("、"))

 
       打印结果:
        

         Alice -> 10、Bob -> 8、City -> 5、XX -> 8
         Bob -> 8、City -> 5、XX -> 8

 
  
三、迭代映射
       1.遍历映射中的元素
           for((k,v)<-映射) 处理k,v
           例,这里涉及模式匹配的知识,在后面会有介绍到
        

  for((k,v) <- remove){
         print(k+"--->")
         println(v)
         }

   println(remove.keySet)
   println(remove.values)

 
        打印出
        Set(Bob, City, XX)
        MapLike(8, 5, 8)

        2.当然我们可以进行一个映射的反转
        

val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 8, "City" -> 5)

 
         //我们可以用这种比较容易理解的方式
      

  val test = for ((k, v) <- scores) yield (v, k)

 
         //但是我们也可以使用这种更加Scala的用法
       

         val easy = scores.map(x => (x._2, x._1))
         println("scores:\n"+scores.mkString("、"))
         println("test:\n"+test.mkString("、"))
         println("easy:\n"+easy.mkString("、"))

 
         打印结果为
      

       scores:
         Bob -> 8、City -> 5、Alice -> 10
        test:
         8 -> Bob、5 -> City、10 -> Alice
        easy:
         8 -> Bob、5 -> City、10 -> Alice

 
       
        3.我们也可以对映射进行过滤,下面的例子是对map进行过滤并反转键值
        //这是一种比较常规的方法
      

  val forFilter = for ((k, v) <- scores if v > 6) yield (v, k)

 
         //这是比较Scala的做法也是让我狂热的方法
   

 val scalaFilter = scores.filter(x => (x._2 > 6)).map(x => (x._2, x._1)


         关于Map的就介绍这里

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值