「这是我参与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
的翻转
案例:
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的区别一致