• 【scala】集和映射


      Scala同时提供了集(Set)和映射(Map)的可变和不可变的不同选择,但使用同样的简单名字,可以通过类继承的关系来区分可变和不可变版本。

      

      如图所示,左边的为不可变集,右边的为可变集。

    //我们创建并初始化一个不可变集
    var jetSet = Set("Boeing","Airbus");
    jetSet += "Lear";
    //要添加新元素,可以对集调用+方法,传入新的元素
    //不论式可变的还是不可变的集,+方法都会创建一个新的包含新元素的集
    //可变集提供了一个实际的+=方法,不可变集并不直接提供这个方法
    
    //我们创建一个可变集
    import scala.collection.mutable
    val movieSet = mutable.Set("Hitch","Poltergeist");
    movieSet += "Shrek";
    
    //如果需要一个不可变的HashSet
    import scala.collection.immutable.HashSet
    val hashSet = HashSet("Tomatoes","Chilies");

    Set的一些常用方法

    1

    def +(elem: A): Set[A]

    为集合添加新元素,x并创建一个新的集合,除非元素已存在

    2

    def -(elem: A): Set[A]

    移除集合中的元素,并创建一个新的集合

    3

    def contains(elem: A): Boolean

    如果元素在集合中存在,返回 true,否则返回 false。

    4

    def &(that: Set[A]): Set[A]

    返回两个集合的交集

    5

    def &~(that: Set[A]): Set[A]

    返回两个集合的差集

    6

    def +(elem1: A, elem2: A, elems: A*): Set[A]

    通过添加传入指定集合的元素创建一个新的不可变集合

    7

    def ++(elems: A): Set[A]

    合并两个集合

    8

    def -(elem1: A, elem2: A, elems: A*): Set[A]

    通过移除传入指定集合的元素创建一个新的不可变集合

    9

    def addString(b: StringBuilder): StringBuilder

    将不可变集合的所有元素添加到字符串缓冲区

    10

    def addString(b: StringBuilder, sep: String): StringBuilder

    将不可变集合的所有元素添加到字符串缓冲区,并使用指定的分隔符

    11

    def apply(elem: A)

    检测集合中是否包含指定元素

    12

    def count(p: (A) => Boolean): Int

    计算满足指定条件的集合元素个数

    13

    def copyToArray(xs: Array[A], start: Int, len: Int): Unit

    复制不可变集合元素到数组

    14

    def diff(that: Set[A]): Set[A]

    比较两个集合的差集

    15

    def drop(n: Int): Set[A]]

    返回丢弃前n个元素新集合

    16

    def dropRight(n: Int): Set[A]

    返回丢弃最后n个元素新集合

    17

    def dropWhile(p: (A) => Boolean): Set[A]

    从左向右丢弃元素,直到条件p不成立

    18

    def equals(that: Any): Boolean

    equals 方法可用于任意序列。用于比较系列是否相等。

    19

    def exists(p: (A) => Boolean): Boolean

    判断不可变集合中指定条件的元素是否存在。

    20

    def filter(p: (A) => Boolean): Set[A]

    输出符合指定条件的所有不可变集合元素。

    21

    def find(p: (A) => Boolean): Option[A]

    查找不可变集合中满足指定条件的第一个元素

    22

    def forall(p: (A) => Boolean): Boolean

    查找不可变集合中满足指定条件的所有元素

    23

    def foreach(f: (A) => Unit): Unit

    将函数应用到不可变集合的所有元素

    24

    def head: A

    获取不可变集合的第一个元素

    25

    def init: Set[A]

    返回所有元素,除了最后一个

    26

    def intersect(that: Set[A]): Set[A]

    计算两个集合的交集

    27

    def isEmpty: Boolean

    判断集合是否为空

    28

    def iterator: Iterator[A]

    创建一个新的迭代器来迭代元素

    29

    def last: A

    返回最后一个元素

    30

    def map[B](f: (A) => B): immutable.Set[B]

    通过给定的方法将所有元素重新计算

    31

    def max: A

    查找最大元素

    32

    def min: A

    查找最小元素

    33

    def mkString: String

    集合所有元素作为字符串显示

    34

    def mkString(sep: String): String

    使用分隔符将集合所有元素作为字符串显示

    35

    def product: A

    返回不可变集合中数字元素的积。

    36

    def size: Int

    返回不可变集合元素的数量

    37

    def splitAt(n: Int): (Set[A], Set[A])

    把不可变集合拆分为两个容器,第一个由前 n 个元素组成,第二个由剩下的元素组成

    38

    def subsetOf(that: Set[A]): Boolean

    如果集合中含有子集返回 true,否则返回false

    39

    def sum: A

    返回不可变集合中所有数字元素之和

    40

    def tail: Set[A]

    返回一个不可变集合中除了第一元素之外的其他元素

    41

    def take(n: Int): Set[A]

    返回前 n 个元素

    42

    def takeRight(n: Int):Set[A]

    返回后 n 个元素

    43

    def toArray: Array[A]

    将集合转换为数组

    44

    def toBuffer[B >: A]: Buffer[B]

    返回缓冲区,包含了不可变集合的所有元素

    45

    def toList: List[A]

    返回 List,包含了不可变集合的所有元素

    46

    def toMap[T, U]: Map[T, U]

    返回 Map,包含了不可变集合的所有元素

    47

    def toSeq: Seq[A]

    返回 Seq,包含了不可变集合的所有元素

    48

    def toString(): String

    返回一个字符串,以对象来表示

      上图为映射的类继承关系图,跟集的继承关系图结构是一样的。

      

    //创建并初始化使用一个可变的映射
    import scala.collection.mutable
    
    val treasureMap = mutable.Map[Int,String]();
    treasureMap += (1 -> "Go to island");
    treasureMap += (2 -> "Find big X on ground");
    treasureMap += (3 -> "Dig");
    println(treasureMap(2));//打印 Find big X on ground

      Scala通过 -> 方法和 += 方法向映射添加键值对。当你写 1 -> "Go to island" 时,实际上是对这个值为1的整数调用 -> 方法,传入字符串“Go to island”。

      可以在Scala的任何对象上调用这个 -> 方法,它将返回包含键和值两个元素的元组。然后将这个元组传给treasureMap指向的那个映射对象的+=方法。

      当使用不可变的映射,不需要任何引入,因为默认的映射就是不可变的。

    //创建并初始化一个不可变的映射
    val romanNumeral = Map(1 -> "I",2 -> "II",3 -> "III"); println(romanNumeral(2));

     Map的一些常用方法

    1

    def ++(xs: Map[(A, B)]): Map[A, B]

    返回一个新的 Map,新的 Map xs 组成

    2

    def -(elem1: A, elem2: A, elems: A*): Map[A, B]

    返回一个新的 Map, 移除 key 为 elem1, elem2 或其他 elems。

    3

    def --(xs: GTO[A]): Map[A, B]

    返回一个新的 Map, 移除 xs 对象中对应的 key

    4

    def get(key: A): Option[B]

    返回指定 key 的值

    5

    def iterator: Iterator[(A, B)]

    创建新的迭代器,并输出 key/value 对

    6

    def addString(b: StringBuilder): StringBuilder

    将 Map 中的所有元素附加到StringBuilder,可加入分隔符

    7

    def addString(b: StringBuilder, sep: String): StringBuilder

    将 Map 中的所有元素附加到StringBuilder,可加入分隔符

    8

    def apply(key: A): B

    返回指定键的值,如果不存在返回 Map 的默认方法

    9

    def clear(): Unit

    清空 Map

    10

    def clone(): Map[A, B]

    从一个 Map 复制到另一个 Map

    11

    def contains(key: A): Boolean

    如果 Map 中存在指定 key,返回 true,否则返回 false。

    12

    def copyToArray(xs: Array[(A, B)]): Unit

    复制集合到数组

    13

    def count(p: ((A, B)) => Boolean): Int

    计算满足指定条件的集合元素数量

    14

    def default(key: A): B

    定义 Map 的默认值,在 key 不存在时返回。

    15

    def drop(n: Int): Map[A, B]

    返回丢弃前n个元素新集合

    16

    def dropRight(n: Int): Map[A, B]

    返回丢弃最后n个元素新集合

    17

    def dropWhile(p: ((A, B)) => Boolean): Map[A, B]

    从左向右丢弃元素,直到条件p不成立

    18

    def empty: Map[A, B]

    返回相同类型的空 Map

    19

    def equals(that: Any): Boolean

    如果两个 Map 相等(key/value 均相等),返回true,否则返回false

    20

    def exists(p: ((A, B)) => Boolean): Boolean

    判断集合中指定条件的元素是否存在

    21

    def filter(p: ((A, B))=> Boolean): Map[A, B]

    返回满足指定条件的所有集合

    22

    def filterKeys(p: (A) => Boolean): Map[A, B]

    返回符合指定条件的不可变 Map

    23

    def find(p: ((A, B)) => Boolean): Option[(A, B)]

    查找集合中满足指定条件的第一个元素

    24

    def foreach(f: ((A, B)) => Unit): Unit

    将函数应用到集合的所有元素

    25

    def init: Map[A, B]

    返回所有元素,除了最后一个

    26

    def isEmpty: Boolean

    检测 Map 是否为空

    27

    def keys: Iterable[A]

    返回所有的key/p>

    28

    def last: (A, B)

    返回最后一个元素

    29

    def max: (A, B)

    查找最大元素

    30

    def min: (A, B)

    查找最小元素

    31

    def mkString: String

    集合所有元素作为字符串显示

    32

    def product: (A, B)

    返回集合中数字元素的积。

    33

    def remove(key: A): Option[B]

    移除指定 key

    34

    def retain(p: (A, B) => Boolean): Map.this.type

    如果符合满足条件的返回 true

    35

    def size: Int

    返回 Map 元素的个数

    36

    def sum: (A, B)

    返回集合中所有数字元素之和

    37

    def tail: Map[A, B]

    返回一个集合中除了第一元素之外的其他元素

    38

    def take(n: Int): Map[A, B]

    返回前 n 个元素

    39

    def takeRight(n: Int): Map[A, B]

    返回后 n 个元素

    40

    def takeWhile(p: ((A, B)) => Boolean): Map[A, B]

    返回满足指定条件的元素

    41

    def toArray: Array[(A, B)]

    集合转数组

    42

    def toBuffer[B >: A]: Buffer[B]

    返回缓冲区,包含了 Map 的所有元素

    43

    def toList: List[A]

    返回 List,包含了 Map 的所有元素

    44

    def toSeq: Seq[A]

    返回 Seq,包含了 Map 的所有元素

    45

    def toSet: Set[A]

    返回 Set,包含了 Map 的所有元素

    46

    def toString(): String

    返回字符串对象

  • 相关阅读:
    深入理解Java虚拟机二之Java内存区域与内存溢出异常
    深入理解java虚拟机一之走进Java
    数据结构之链表
    Spring AOP 详解
    Spring IOC 注入方式详解 附代码
    图的广度优先遍历
    图的深度优先遍历
    MySql 中的<=>操作符
    mysql数据库explain命令用法详解
    Java虚拟机内存分配详解
  • 原文地址:https://www.cnblogs.com/zzhangyuhang/p/8665903.html
Copyright © 2020-2023  润新知