Scala——集合(上)

129 阅读5分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

Java中的集合可分为: List,Set,Map (可变)

  • List有序,可重复 列举:LinkedList,ArrayList
  • Set无序,不可重复 列举:HashSet,TreeSet
  • Map无序,(K-V) key不能重复, value可重复 列举: HashMap,Hashtable,TreeMap
  • 数组(不可变) 举例: int[] ints = new int[4]

scala中的集合分为:两大类可变mutable & 不可变immutable

Scala默认采用不可变集合,对于几乎所有的集合类,Scala都同时提供了可变(mutable)和不可变(immutable)的版本

  • 不可变集合包名:scala.collection.immutable
  • 可变集合包名: scala.collection.mutable

集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质

  • 不可变集合:scala不可变集合,就是这个集合本身不能动态变化。(类似java的数组,是不可以动态增长的)
  • 可变集合:可变集合,就是这个集合本身可以动态变化的。(比如:ArrayList , 是可以动态增长的)

Map

map的一些方法

def ++(xs: Map[(A, B)]): Map[A, B]返回一个新的 Map,新的 Map xs 组成
def -(elem1: A, elem2: A, elems: A): Map[A, B]返回一个新的 Map, 移除 key 为 elem1, elem2 或其他 elems。
def --(xs: GTO[A]): Map[A, B]返回一个新的 Map, 移除 xs 对象中对应的 key
def toString(): String返回字符串对象
def toSet: Set[A]返回 Set,包含了 Map 的所有元素
def toSeq: Seq[A]返回 Seq,包含了 Map 的所有元素
def toList: List[A]返回 List,包含了 Map 的所有元素
def toBuffer[B >: A]: Buffer[B]返回缓冲区,包含了 Map 的所有元素
def toArray: Array[(A, B)]集合转数组
def takeWhile(p: ((A, B)) => Boolean): Map[A, B]返回满足指定条件的元素
def takeRight(n: Int): Map[A, B]返回后 n 个元素
def take(n: Int): Map[A, B]*返回前 n 个元素
def tail: Map[A, B]返回一个集合中除了第一元素之外的其他元素
def sum: (A, B)返回集合中所有数字元素之和
def size: Int返回 Map 元素的个数
def retain(p: (A, B) => Boolean): Map.this.type如果符合满足条件的返回 true
def remove(key: A): Option[B]移除指定 key
def product: (A, B)返回集合中数字元素的积。
def mkString: String集合所有元素作为字符串显示
def min: (A, B)查找最小元素
def max: (A, B)查找最大元素
def last: (A, B)返回最后一个元素
def keys: Iterable[A]返回所有的key
def isEmpty: Boolean检测 Map 是否为空
def init: Map[A, B]返回所有元素,除了最后一个
def foreach(f: ((A, B)) => Unit): Unit将函数应用到集合的所有元素
def find(p: ((A, B)) => Boolean): Option[(A, B)]查找集合中满足指定条件的第一个元素
def filterKeys(p: (A) => Boolean): Map[A, B]返回符合指定条件的不可变 Map
def filter(p: ((A, B))=> Boolean): Map[A, B]返回满足指定条件的所有集合
def exists(p: ((A, B)) => Boolean): Boolean判断集合中指定条件的元素是否存在
def equals(that: Any): Boolean如果两个 Map 相等(key/value 均相等),返回true,否则返回false
def empty: Map[A, B]返回相同类型的空 Map
def dropWhile(p: ((A, B)) => Boolean): Map[A, B]从左向右丢弃元素,直到条件p不成立
def dropRight(n: Int): Map[A, B]返回丢弃最后n个元素新集合
def drop(n: Int): Map[A, B]返回丢弃前n个元素新集合
def default(key: A): B定义 Map 的默认值,在 key 不存在时返回。
def count(p: ((A, B)) => Boolean): Int计算满足指定条件的集合元素数量
def copyToArray(xs: Array[(A, B)]): Unit复制集合到数组
def contains(key: A): Boolean如果 Map 中存在指定 key,返回 true,否则返回 false。
def clone(): Map[A, B]从一个 Map 复制到另一个 Map
def clear(): Unit清空 Map
def apply(key: A): B返回指定键的值,如果不存在返回 Map 的默认方法
def addString(b: StringBuilder, sep: String): StringBuilder将 Map 中的所有元素附加到StringBuilder,可加入分隔符
def addString(b: StringBuilder): StringBuilder将 Map 中的所有元素附加到StringBuilder,可加入分隔符
def iterator: Iterator[(A, B)]创建新的迭代器,并输出 key/value 对
def get(key: A): Option[B]返回指定 key 的值

在scala中,映射()是一个对偶,对偶是两个值构成的组,这两个值不一定是同一类型。

使用 -> 来创建对偶

不可修改的map案例

//默认创建的map为不可修改的map
def main(args: Array[String]): Unit = {
    //默认为不可修改的map
    val map: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)
    //不可修改内容 也不可以添加
     map.foreach(println)
    println("----------------------")
   // map+=("d"<-5) 错误
    **/*
      但是可以将值复制给其他变量,在过程当中可以进行对数据的修改
     */**
    val copy=map+("d"->4)-"c"
    copy.foreach(println)
  }
_____________________________________________________________
输出:
(a,1)
(b,2)
(c,3)
----------------------
(a,1)
(b,2)
(d,4)

可修改的map案例

def main(args: Array[String]): Unit = {
    val score = scala.collection.mutable.Map("Alice" -> 90)
    **println("可直接进行数据的添加")**
    score += ("JACQUESH" -> 18)
    score.foreach(println)
 **   println("使用(key值)取出对应的值")**
    println(score("Alice"))
    **println("使用contains 函数来查找是否存在对应的值")**
    println(score.contains("JACQUESH"))
    **println("使用getOrElse 函数来取出对应的值 当值不存在的时候使用后方定义的默认值")**
    println(score.getOrElse("J", 6))
    **println("当需要更新值得时候,只需要(key)=值,map中不存在则添加 存在则修改")**
    score("J") = 66
    score("Alice") = 88
    score.foreach(println)
    **println("在map中可以使用 -=  来进行数据的移除操作")**
    score -= "J"
    score.foreach(println)
    **println("在map的遍历可以使用for 具体操作如下")**
    for ((key, value) <- score) {
      println(s"key为:$key \t value为: $value")
    }
    for (item<- score) {
      println(s"item为:$item")
    }
  }

___________________________________________
输出:
可直接进行数据的添加
(Alice,90)
(JACQUESH,18)
使用(key值)取出对应的值
90
使用contains 函数来查找是否存在对应的值
true
使用getOrElse 函数来取出对应的值 当值不存在的时候使用后方定义的默认值
6
当需要更新值得时候,只需要(key)=值,map中不存在则添加 存在则修改
(J,66)
(Alice,88)
(JACQUESH,18)
在map中可以使用 -=  来进行数据的移除操作
(Alice,88)
(JACQUESH,18)
在map的遍历可以使用for 具体操作如下
key为:Alice 	 value为: 88
key为:JACQUESH 	 value为: 18
item为:(Alice,88)
item为:(JACQUESH,18)

特殊使用

可以使用yield对map进行key-value的翻转

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

案例:

def main(args: Array[String]): Unit = {
    println("可以使用yield对map进行key-value的翻转")
    val scores = scala.collection.mutable.Map("A" -> 90,"B"->80,"C"->70,"D"->60)
    val some =for( (k, v) <- scores) yield (v, k)
    some.foreach(println)
  }
————————————————————————————————————————————
输出:
可以使用yield对map进行key-value的翻转
(80,B)
(70,C)
(60,D)
(90,A)

但是看上方并没有进行排序,顺序是混乱的

可以使用SortedMap 这样数据就具有一定的顺序

def main(args: Array[String]): Unit = {
 **//进入的数据是无序的**
     val scores = SortedMap("A"-> 90,"B"->80,"D"->50,"C"->75)
     scores.foreach(println)
}
________________________________________
**//但是输出的数据是有序的**
输出:
(A,90)
(B,80)
(C,75)
(D,50)

同理

List和Set 如上方的Map和JAVA的区别一致