• Scala从入门到精通之四-映射和元组


      在Scala中映射之键值对的集合,元组是n个对象的聚集,但是对象的类型不一定相同

    本节内容要点

    1.   Scala中映射的创建,遍历和查询
    2.   如何从可变和不可变映射中做出选择
    3.   Scala映射和Java映射见的互操作
    4.   Scala中元组的使用

    一.构造映射

       我们可以这样来构造一个映射:

    val scores = Map("ysl"->100,"wdd"->90)
    

        上述代码构造一个不可变的Map[String,Int],其值不可以被改变。如果需要创建一个可变的映射,可以用:

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

     在Scala中,映射是对偶的集合。对偶简单的说就是两个值构成的组,这两个值的类型不要求相同,比如("ysl",100)

     ->操作符用于创建对偶

     "ysl" -> 100

    上述代码的职位("ysl",100)

     因此,完全可以用下面的方式来创建映射

    val scores = Map(("ysl",100),("wdd",90))
    

     二.获取映射的值

      在Scala中映射和函数之间的相似性十分的明显,因为你可以使用()表示法来查询某个键值对的值

    val yslScore = scores("ysl")
    

     如果映射中不包含查询的值,将会抛出异常。

    要检查映射中是否包含某个键值可以使用contains方法:

    val yslScore = if(scores.contains("ysl")) scores("ysl") else 0
    

     有这种用法十分的普遍,Scala提供了一个简便的方法来简化上述操作 

    val yslScore = scores.getOrElse("ysl",0)
    

     注意:映射.get(键)这样的调用的返回值是一个Option对象,要么是Some(键值对的值),要么是None,我们将在后面详细介绍Opion类

    三.修改映射中的值

      在可变的映射中,你可以修改映射中的值,或则向映射中添加新的映射关系,做法是在=的左测使用(),例如:

    scores("ysl") = 89//更新ysl做对应的值,scores必须是可变的,否则会报错
    
    scores("tom") = 89//增加新的键值对
    

     当然,也可以使用+=操作来添加多个关系

    scores += ("jim"->78,"kit"->56)
    

     要移除某个键值对的值使用-=操作

     scores -= "ysl"
    

     你不能更新一个不可变的映射,但是可以基于某个映射生成一个新的映射

    val newScores = scores + ("jim"->89,"ketty"->100)
    

     四。映射的便利

      你可以使用如下超级简单的方式便利映射

    for((k,v) <- 映射) 处理k,v
    

       之所以能这样便利映射,主要是因为Scala的for循环中使用可模式匹配,这样以来不需要冗余的方法调用,你就可以得到每一个对偶的键值

      如果你只需要访问键或则值,像Java一样可以使用keySet和values方法。values方法返回一个Iterable,你可以使用for便利Iterable

    for(v <- scores.values) print(v)
    

     要转换一个映射,比如交换见和值的位置,可以使用

    for((k,v) <- scores) yield (v,k)
    

     五.排序的映射

      在操作映射的时候,你需要选择一个实现-一个hash表或则一个平衡树。默认Scala使用的是hash表。如果需要顺序访问所有的键,你需要一个树型映射

    要得到一个不可变的树型映射的话可以使用:

    val scores = scala.collection.immutable.SortedMap("ysl"->10,"wdd"->8,"tom"->9)
    

     但是Scala2.12.3中没有可变的树型映射,要实现可变的树型映射,需要使用Java的TreeMap

    如果要按照插入的顺序访问插入的键,可以使用LinkedHashMap

    六.映射Scala与Java互操作

    如果你想要Java的映射转换为Scala的映射,以便方便的使用Scala的API。这对于需要操作Scala并没提供的可变的树型映射的情况是十分的有用的。

    你只需要引入如下的语句便可实现:

    import scala.collection.JavaConversions.mapAsScalaMap
    

     然后制定Scala的映射类型来触发转换

    val scores:scala.collection.mutable.Map[String,Int] = new java.util.TreeMap[String,Int]
    

     除此之外,你还可以得到从.util.Proterties到Map[String,String]的转换

    import scala.collection.JavaConversions.propertiesAsScalaMap
    val props:scala.collection.Map[String,String] = System.getProperties()
    

     反过来把Scala的映射转换为Java的映射,提供相反的隐士转换即可:

    import scala.collection.JavaConversions.mapAsJavaMap
    import java.awt.font.TextAttribute._
    val attrs = Map(FAMILY -> "Serif",SIZE -> 12)
    val font = new java.awt.Font(attrs)
    

     七.元组

      映射是键值对欧的集合,对偶是元组最简单的形态----元组是不同类型值的聚集。

      元组是将单个值包含在()中构成的,例如

      (1,3.14,"tom")

      类型是:Tuple3(Int,Double,String),也可以写成(Int,Double,String)

      你可以使用方法_1,_2,_3来访问元组,比如:

    val second = tt._2
    

     和数组和字符串中的下边不同,元组的下边是从1开始的。

    通常使用模式匹配来获取元组中组员,例如:

    val (first,second,third) = tt
    

     如果不是每一个组员都需要,可以在不需要的位置使用_,例如:

    val (first,second,_) = tt
    

     元组可以用于函数返回值不是一个值的情况。关于函数将在后面详细介绍

    八.拉链操作

      使用元组的原因之一是把多个值绑定在一起,以便他们能够被统一处理,这通常可以用zip方法来完成。例如:

    val symbols = Array("<","-",">")
    val count = Array(2,10,2)
    val pairs = symbols.zip(count)
    

     输出结果为:pairs: Array[(String, Int)] = Array((<,2), (-,10), (>,2))

    然后可以对输出结果作统一的处理:

    for((s,n) <- pairs) Console.print( s * n)
    

     输出结果:<<---------->>

    toMap方法可以对偶集合转化为映射。如:

    symbols.zip(count).toMap
    
  • 相关阅读:
    三种常用排序理论
    无参带返回类型方法练习
    无参带返回类型方法总结
    Java_无参数无返回类型方法及练习
    Java_方法的调用②及案例
    方法内存分析(进栈(压栈)、出栈(弹栈))
    Java_方法的基本语法格式
    Java_方法的调用①及案例
    Java_方法的定义以及分类
    Java_break与continue区别
  • 原文地址:https://www.cnblogs.com/senlinyang/p/7791733.html
Copyright © 2020-2023  润新知