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