Set集合 #

一、Set 基础 #

1.1 创建 Set #

scala
val set1 = Set(1, 2, 3, 4, 5)
val set2 = Set(1, 1, 2, 2, 3)
val set3 = Set.empty[Int]
val set4 = Set.fill(5)(scala.util.Random.nextInt(10))

1.2 Set 特点 #

  • 不可变(默认)
  • 无序
  • 元素唯一(自动去重)

1.3 基本操作 #

scala
val set = Set(1, 2, 3, 4, 5)

set.size
set.isEmpty
set.nonEmpty
set.head
set.last
set.tail
set.take(3)
set.drop(2)

二、Set 操作 #

2.1 添加元素 #

scala
val set = Set(1, 2, 3)

val set1 = set + 4
val set2 = set + (4, 5, 6)
val set3 = set ++ Set(4, 5, 6)

2.2 删除元素 #

scala
val set = Set(1, 2, 3, 4, 5)

val set1 = set - 3
val set2 = set - (1, 2)
val set3 = set -- Set(1, 2, 3)

2.3 集合运算 #

scala
val set1 = Set(1, 2, 3, 4)
val set2 = Set(3, 4, 5, 6)

val union = set1 | set2
val union2 = set1 ++ set2
val union3 = set1.union(set2)

val intersect = set1 & set2
val intersect2 = set1.intersect(set2)

val diff = set1 &~ set2
val diff2 = set1.diff(set2)
val diff3 = set1 -- set2

2.4 子集判断 #

scala
val set1 = Set(1, 2, 3)
val set2 = Set(1, 2, 3, 4, 5)

set1.subsetOf(set2)
set2.subsetOf(set1)
set1 == set2

三、常用方法 #

3.1 查找 #

scala
val set = Set(1, 2, 3, 4, 5)

set.contains(3)
set(3)
set.find(_ > 3)
set.filter(_ > 3)
set.filterNot(_ > 3)

3.2 检查 #

scala
val set = Set(1, 2, 3, 4, 5)

set.isEmpty
set.nonEmpty
set.exists(_ > 3)
set.forall(_ > 0)

3.3 转换 #

scala
val set = Set(1, 2, 3, 4, 5)

set.map(_ * 2)
set.flatMap(n => Set(n, n * 2))
set.groupBy(_ % 2)
set.partition(_ > 3)

3.4 聚合 #

scala
val set = Set(1, 2, 3, 4, 5)

set.sum
set.product
set.min
set.max
set.reduce(_ + _)
set.fold(0)(_ + _)

四、可变 Set #

4.1 创建 mutable Set #

scala
import scala.collection.mutable

val set = mutable.Set(1, 2, 3)
val empty = mutable.Set.empty[Int]

4.2 添加元素 #

scala
import scala.collection.mutable

val set = mutable.Set(1, 2, 3)

set += 4
set += (5, 6)
set ++= Set(7, 8)
set.add(9)

4.3 删除元素 #

scala
import scala.collection.mutable

val set = mutable.Set(1, 2, 3, 4, 5)

set -= 3
set -= (1, 2)
set --= Set(4, 5)
set.remove(6)
set.clear()

4.4 更新元素 #

scala
import scala.collection.mutable

val set = mutable.Set(1, 2, 3)

set.update(2, true)
set.update(4, true)
set.update(1, false)

五、Set 实现 #

5.1 HashSet #

默认实现,基于哈希表:

scala
val hashSet = scala.collection.immutable.HashSet(1, 2, 3, 4, 5)

5.2 TreeSet #

有序集合,基于红黑树:

scala
import scala.collection.immutable.TreeSet

val treeSet = TreeSet(3, 1, 4, 1, 5, 9, 2, 6)
println(treeSet)

val reverseSet = TreeSet(3, 1, 4, 1, 5)(Ordering[Int].reverse)

5.3 LinkedHashSet #

保持插入顺序:

scala
import scala.collection.mutable.LinkedHashSet

val linkedSet = LinkedHashSet(3, 1, 4, 1, 5)
println(linkedSet)

5.4 SortedSet #

排序集合:

scala
import scala.collection.immutable.SortedSet

val sorted = SortedSet(3, 1, 4, 1, 5, 9, 2, 6)
println(sorted)

六、Set 实战 #

6.1 去重 #

scala
val list = List(1, 1, 2, 2, 3, 3, 4, 4, 5)
val unique = list.toSet.toList

val words = List("apple", "banana", "apple", "cherry", "banana")
val uniqueWords = words.toSet

6.2 查找共同元素 #

scala
def commonElements(list1: List[Int], list2: List[Int]): List[Int] =
  list1.toSet.intersect(list2.toSet).toList

val result = commonElements(List(1, 2, 3, 4), List(3, 4, 5, 6))

6.3 查找差异 #

scala
def uniqueToFirst(list1: List[Int], list2: List[Int]): List[Int] =
  list1.toSet.diff(list2.toSet).toList

val result = uniqueToFirst(List(1, 2, 3, 4), List(3, 4, 5, 6))

6.4 标签系统 #

scala
case class Article(title: String, tags: Set[String])

val articles = List(
  Article("Scala Intro", Set("scala", "programming")),
  Article("Java Basics", Set("java", "programming")),
  Article("Python Tips", Set("python", "programming")),
  Article("Scala Advanced", Set("scala", "advanced"))
)

def findByTag(tag: String): List[Article] =
  articles.filter(_.tags.contains(tag))

def findByTags(tags: Set[String]): List[Article] =
  articles.filter(a => tags.subsetOf(a.tags))

findByTag("scala")
findByTags(Set("scala", "programming"))

七、性能考虑 #

7.1 时间复杂度 #

操作 HashSet TreeSet
contains O(1) O(log n)
add O(1) O(log n)
remove O(1) O(log n)
min/max O(n) O(log n)

7.2 选择建议 #

场景 推荐
快速查找 HashSet
有序遍历 TreeSet
保持插入顺序 LinkedHashSet

八、总结 #

Set 操作速查 #

操作 方法
添加 +, ++
删除 -, –
并集 |, ++, union
交集 &, intersect
差集 &~, diff, –
子集 subsetOf
包含 contains, apply

可变 vs 不可变 #

特性 不可变 Set 可变 Set
修改 返回新集合 原地修改
操作符 +, - +=, -=
线程安全

下一步,让我们学习 Map映射

最后更新:2026-03-27