Scala 集合:Set API

Set 用于表示一个不包含重复元素的集合,不强调元素的顺序性。Set 同样被定义为是一个特质类型,区分可变与不可变,定义如下:

1
2
3
4
5
trait Set[A] extends (A => Boolean)
with Iterable[A]
with GenSet[A]
with GenericSetTemplate[A, Set]
with SetLike[A, Set[A]]

一. 插入操作

1.1 +

函数 + 用于往 Set 对象中添加一个或多个元素,其定义如下:

1
2
def + (elem: A): This
def + (elem1: A, elem2: A, elems: A*): This = this + elem1 + elem2 ++ elems

示例:

1
2
3
val set = Set(1, 2, 3)
set + 4 // 输出:Set(1, 2, 3, 4)
set + (4, 5) // 输出:Set(5, 1, 2, 3, 4)

1.2 ++ & ++:

函数 ++ 接收一个 GenTraversableOnce 类型的参数,只要是继承自 GenTraversableOnce 的集合都可以作为参数,函数会将参数中所包含的元素添加到原 Set 对象中,并创建一个新的 Set 对象返回。示例:

1
2
3
val set = Set(1, 2, 3)
set ++ Seq(4, 5) // 输出:Set(5, 1, 2, 3, 4)
set ++: Seq(4, 5) // 输出:List(1, 2, 3, 4, 5)

函数 ++: 相对于 ++ 的区别在于右结合,所以上面的示例对应的结果类型是 List。

1.3 += & ++= & add

对于可变集合而言,可以实现原地插入,函数 += 对标 +,而 ++= 则对标 ++,示例:

1
2
3
4
5
6
val mset = mutable.Set(1, 2, 3)
mset += 4
mset += (5, 6)
mset // 输出:Set(1, 5, 2, 6, 3, 4)
mset ++= Set(7, 8)
mset // 输出:Set(1, 5, 2, 6, 3, 7, 4, 8)

函数 add 同样适用于可变 Set 对象,用于往 Set 对象中添加单个元素,如果 Set 中已经包含该元素则返回 false,否则返回 true。示例:

1
2
3
val mset = mutable.Set(1, 2, 3)
mset.add(3) // 输出:false
mset.add(4) // 输出:true

二. 更新操作

2.1 update

对于可变集合来说,函数 update 用于更新集合中的元素(定义如下),其中参数 elem 对应需要更新的元素值,而参数 included 则用于指定是添加(included = true)还是删除(included = false)。

1
def update(elem: A, included: Boolean)

示例:

1
2
3
4
5
val set = mutable.Set(1, 2, 3)
set.update(0, included = true)
set // 输出:Set(0, 1, 2, 3)
set.update(0, included = false)
set // 输出:Set(1, 2, 3)

其中 set.update(0, included = true) 可以简写为 set(0) = trueset.update(0, included = false) 可以简写为 set(0) = false

三. 删除操作

3.1 - & --

函数 - 用于从 Set 对象中移除一个或多个元素,而函数 -- 则接收一个 GenTraversableOnce 类型参数,只要是继承自 GenTraversableOnce 的集合都可以作为参数,函数会从原 Set 对象中移除参数集合中所包含的元素。示例:

1
2
3
4
val set = Set(1 to 9: _*)
set - 1 // 输出:Set(5, 6, 9, 2, 7, 3, 8, 4)
set - (9, 8) // 输出:Set(5, 1, 6, 2, 7, 3, 4)
set -- Seq(7, 6) // 输出:Set(5, 1, 9, 2, 3, 8, 4)

3.2 -= & --=

对于可变集合而言,可以实现原地删除,函数 -= 对标 -,而 --= 则对标 --,示例:

1
2
3
4
5
6
val mset = mutable.Set(1 to 9: _*)
mset -= 1
mset -= (9, 8)
mset // 输出:Set(5, 2, 6, 3, 7, 4)
mset --= Seq(7, 6)
mset // 输出:Set(5, 2, 3, 4)

3.3 remove & retain & clear

函数 remove 用于从 Set 中移除单个元素,如果对应的元素存在则返回 true,否则返回 false;函数 retain 接收一个谓词 A => Boolean,用于移除所有不满足条件的元素;函数 clear 则用于清空所有元素。示例:

1
2
3
4
5
6
7
val mset = mutable.Set(1 to 9: _*)
mset.remove(1) // 输出:true
mset.remove(1) // 输出:false
mset.retain(_ % 2 == 0)
mset // 输出:Set(2, 6, 4, 8)
mset.clear()
mset // 输出:Set()

四. 包含检查

4.1 contains & apply

函数 contains 用于检查 Set 对象中是否包含指定的元素,这是一个从父特质继承而来的方法,对于 Set 来说,可以使用 apply 函数检查是否包含指定元素,同样,函数 apply 可以使用 () 简写。示例:

1
2
3
4
val set = Set(1, 2, 3)
set.contains(2) // 输出:true
set.apply(5) // 输出:false
set(5) // 输出:false

4.2 subsetOf

函数 subsetOf 用于检查当前 Set 对象是否是参数给定的 Set 的子集,示例:

1
2
3
val set = Set(1, 2, 3)
set.subsetOf(Set(1, 2, 3, 4)) // 输出:true
set.subsetOf(Set(1, 2)) // 输出:false

五. 集合操作

5.1 intersect & &

函数 intersect 用于对于两个 Set 对象求 交集 ,也可以简写为 &,示例:

1
2
3
4
val set1 = Set(1, 2, 3)
val set2 = Set(3, 4, 5)
set1.intersect(set2) // 输出:Set(3)
set1 & set2 // 输出:Set(3)

5.2 union & |

函数 union 用于对于两个 Set 对象求 并集 ,也可以简写为 |,示例:

1
2
3
4
val set1 = Set(1, 2, 3)
val set2 = Set(3, 4, 5)
set1.union(set2) // 输出:Set(5, 1, 2, 3, 4)
set1 | set2 // 输出:Set(5, 1, 2, 3, 4)

5.3 diff & &~

函数 diff 用于对两个 Set 对象求 差集 ,也可以简写为 &~,示例:

1
2
3
4
val set1 = Set(1, 2, 3)
val set2 = Set(3, 4, 5)
set1.diff(set2) // 输出:Set(1, 2)
set1 &~ set2 // 输出:Set(1, 2)

参考