@@ -12,7 +12,7 @@ language: zh-cn
12
12
13
13
集合是不包含重复元素的可迭代对象。下面的通用集合表和可变集合表中概括了集合类型适用的运算。分为几类:
14
14
15
- - ** 测试型的方法:** contains, apply, subsetOf。contains方法用于判断集合是否包含某元素。集合的apply方法和contains方法的作用相同 ,因此 set(elem) 等同于set constains elem。这意味着集合对象的名字能作为其自身是否包含某元素的测试函数。
15
+ - ** 测试型的方法:** ` contains ` , ` apply ` , ` subsetOf ` 。 ` contains ` 方法用于判断集合是否包含某元素。集合的 ` apply ` 方法和 ` contains ` 方法的作用相同 ,因此 ` set(elem) ` 等同于 ` set contains elem` 。这意味着集合对象的名字能作为其自身是否包含某元素的测试函数。
16
16
17
17
例如
18
18
@@ -24,34 +24,34 @@ language: zh-cn
24
24
scala> fruit("potato")
25
25
res1: Boolean = false
26
26
27
- - ** 加法类型的方法:** + 和 ++ 。添加一个或多个元素到集合中,产生一个新的集合。
28
- - ** 减法类型的方法:** - 、-- 。它们实现从一个集合中移除一个或多个元素,产生一个新的集合。
29
- - ** Set运算包括并集、交集和差集** 。每一种运算都存在两种书写形式:字母和符号形式。字母形式:intersect、union和diff ,符号形式:&、|和& ~ 。事实上,Set中继承自Traversable的++也能被看做union或 |的另一个别名。区别是,++的参数为Traversable对象,而union和| 的参数是集合。
27
+ - ** 加法类型的方法:** ` + ` 和 ` ++ ` 。添加一个或多个元素到集合中,产生一个新的集合。
28
+ - ** 减法类型的方法:** ` - ` 、 ` -- ` 。它们实现从一个集合中移除一个或多个元素,产生一个新的集合。
29
+ - ** Set运算包括并集、交集和差集** 。每一种运算都存在两种书写形式:字母和符号形式。字母形式:` intersect ` 、 ` union ` 和 ` diff ` ,符号形式:` & ` 、 ` | ` 和 ` &~ ` 。事实上,` Set ` 中继承自 ` Traversable ` 的 ` ++ ` 也能被看做 ` union ` 或 |的另一个别名。区别是,` ++ ` 的参数为 ` Traversable ` 对象,而 ` union ` 和 ` | ` 的参数是集合。
30
30
31
31
## Set 类的操作
32
32
33
33
| WHAT IT IS | WHAT IT DOES |
34
34
| ------------------------| --------------------------|
35
35
| ** 实验代码:** | |
36
- | xs contains x | 测试x是否是xs的元素 。 |
37
- | xs(x) | 与xs contains x相同 。 |
38
- | xs subsetOf ys | 测试xs是否是ys的子集 。 |
36
+ | ` xs contains x ` | 测试 ` x ` 是否是 ` xs ` 的元素 。 |
37
+ | ` xs(x) ` | 与 ` xs contains x ` 相同 。 |
38
+ | ` xs subsetOf ys ` | 测试 ` xs ` 是否是 ` ys ` 的子集 。 |
39
39
| ** 加法:** | |
40
- | xs + x | 包含xs中所有元素以及x的集合 。 |
41
- | xs + (x, y, z) | 包含xs中所有元素及附加元素的集合 |
42
- | xs ++ ys | 包含xs中所有元素及ys中所有元素的集合 |
40
+ | ` xs + x ` | 包含 ` xs ` 中所有元素以及 ` x ` 的集合 。 |
41
+ | ` xs + (x, y, z) ` | 包含 ` xs ` 中所有元素及附加元素的集合 |
42
+ | ` xs ++ ys ` | 包含 ` xs ` 中所有元素及 ` ys ` 中所有元素的集合 |
43
43
| ** 移除:** | |
44
- | xs - x | 包含xs中除x以外的所有元素的集合 。 |
45
- | xs - x | 包含xs中除去给定元素以外的所有元素的集合 。 |
46
- | xs -- ys | 集合内容为:xs中所有元素,去掉ys中所有元素后剩下的部分 。 |
47
- | xs.empty | 与xs同类的空集合 。 |
44
+ | ` xs - x ` | 包含 ` xs ` 中除x以外的所有元素的集合 。 |
45
+ | ` xs - x ` | 包含 ` xs ` 中除去给定元素以外的所有元素的集合 。 |
46
+ | ` xs -- ys ` | 集合内容为:` xs ` 中所有元素,去掉 ` ys ` 中所有元素后剩下的部分 。 |
47
+ | ` xs.empty ` | 与 ` xs ` 同类的空集合 。 |
48
48
| ** 二值操作:** | |
49
- | xs & ys | 集合xs和ys的交集 。 |
50
- | xs intersect ys | 等同于 xs & ys。 |
51
- | xs | ys | 集合xs和ys的并集 。 |
52
- | xs union ys | 等同于xs | ys 。 |
53
- | xs &~ ys | 集合xs和ys的差集 。 |
54
- | xs diff ys | 等同于 xs &~ ys。 |
49
+ | ` xs & ys ` | 集合 ` xs ` 和 ` ys ` 的交集 。 |
50
+ | ` xs intersect ys ` | 等同于 ` xs & ys ` 。 |
51
+ | < code > xs &# 124 ; ys</ code > | 集合 ` xs ` 和 ` ys ` 的并集 。 |
52
+ | ` xs union ys ` | 等同于 < code >xs &# 124 ; ys</ code > 。 |
53
+ | ` xs &~ ys ` | 集合 ` xs ` 和 ` ys ` 的差集 。 |
54
+ | ` xs diff ys ` | 等同于 ` xs &~ ys ` 。 |
55
55
56
56
57
57
可变集合提供加法类方法,可以用来添加、删除或更新元素。下面对这些方法做下总结。
@@ -61,26 +61,26 @@ language: zh-cn
61
61
| WHAT IT IS | WHAT IT DOES |
62
62
| ------------------| ------------------------|
63
63
| ** 加法:** | |
64
- | xs += x | 把元素x添加到集合xs中 。该操作有副作用,它会返回左操作符,这里是xs自身 。 |
65
- | xs += (x, y, z) | 添加指定的元素到集合xs中,并返回xs本身 。(同样有副作用) |
66
- | xs ++= ys | 添加集合ys中的所有元素到集合xs中,并返回xs本身 。(表达式有副作用) |
67
- | xs add x | 把元素x添加到集合xs中,如集合xs之前没有包含x,该操作返回true,否则返回false 。 |
64
+ | ` xs += x ` | 把元素 ` x ` 添加到集合 ` xs ` 中 。该操作有副作用,它会返回左操作符,这里是 ` xs ` 自身 。 |
65
+ | ` xs += (x, y, z) ` | 添加指定的元素到集合 ` xs ` 中,并返回 ` xs ` 本身 。(同样有副作用) |
66
+ | ` xs ++= ys ` | 添加集合 ` ys ` 中的所有元素到集合 ` xs ` 中,并返回 ` xs ` 本身 。(表达式有副作用) |
67
+ | ` xs add x ` | 把元素 ` x ` 添加到集合 ` xs ` 中,如集合 ` xs ` 之前没有包含 ` x ` ,该操作返回 ` true ` ,否则返回 ` false ` 。 |
68
68
| ** 移除:** | |
69
- | xs -= x | 从集合xs中删除元素x,并返回xs本身 。(表达式有副作用) |
70
- | xs -= (x, y, z) | 从集合xs中删除指定的元素,并返回xs本身 。(表达式有副作用) |
71
- | xs --= ys | 从集合xs中删除所有属于集合ys的元素,并返回xs本身 。(表达式有副作用) |
72
- | xs remove x | 从集合xs中删除元素x。如之前xs中包含了x元素,返回true,否则返回false 。 |
73
- | xs retain p | 只保留集合xs中满足条件p的元素 。 |
74
- | xs.clear() | 删除集合xs中的所有元素 。 |
69
+ | ` xs -= x ` | 从集合 ` xs ` 中删除元素 ` x ` ,并返回 ` xs ` 本身 。(表达式有副作用) |
70
+ | ` xs -= (x, y, z) ` | 从集合 ` xs ` 中删除指定的元素,并返回 ` xs ` 本身 。(表达式有副作用) |
71
+ | ` xs --= ys ` | 从集合 ` xs ` 中删除所有属于集合 ` ys ` 的元素,并返回 ` xs ` 本身 。(表达式有副作用) |
72
+ | ` xs remove x ` | 从集合 ` xs ` 中删除元素 ` x ` 。如之前 ` xs ` 中包含了 ` x ` 元素,返回 ` true ` ,否则返回 ` false ` 。 |
73
+ | ` xs retain p ` | 只保留集合 ` xs ` 中满足条件 ` p ` 的元素 。 |
74
+ | ` xs.clear() ` | 删除集合 ` xs ` 中的所有元素 。 |
75
75
| ** 更新: ** | |
76
- | xs(x) = b | ( 同 xs.update(x, b) )参数b为布尔类型,如果值为true就把元素x加入集合xs,否则从集合xs中删除x 。 |
76
+ | ` xs(x) = b ` | ( 同 ` xs.update(x, b) ` )参数 ` b ` 为布尔类型,如果值为 ` true ` 就把元素x加入集合 ` xs ` ,否则从集合 ` xs ` 中删除 ` x ` 。 |
77
77
| ** 克隆:** | |
78
- | xs.clone | 产生一个与xs具有相同元素的可变集合 。 |
78
+ | ` xs.clone ` | 产生一个与 ` xs ` 具有相同元素的可变集合 。 |
79
79
80
80
81
81
与不变集合一样,可变集合也提供了` + ` 和` ++ ` 操作符来添加元素,` - ` 和` -- ` 用来删除元素。但是这些操作在可变集合中通常很少使用,因为这些操作都要通过集合的拷贝来实现。可变集合提供了更有效率的更新方法,` += ` 和` -= ` 。 ` s += elem ` ,添加元素elem到集合s中,并返回产生变化后的集合作为运算结果。同样的,` s -= elem ` 执行从集合s中删除元素elem的操作,并返回产生变化后的集合作为运算结果。除了` += ` 和` -= ` 之外还有从可遍历对象集合或迭代器集合中添加和删除所有元素的批量操作符` ++= ` 和` --= ` 。
82
82
83
- 选用` += ` 和` -= ` 这样的方法名使得我们得以用非常近似的代码来处理可变集合和不可变集合。先看一下以下处理不可变集合s的REPL会话 :
83
+ 选用` += ` 和` -= ` 这样的方法名使得我们得以用非常近似的代码来处理可变集合和不可变集合。先看一下以下处理不可变集合 ` s ` 的REPL会话 :
84
84
85
85
scala> var s = Set(1, 2, 3)
86
86
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
@@ -89,7 +89,7 @@ language: zh-cn
89
89
scala> s
90
90
res2: scala.collection.immutable.Set[Int] = Set(1, 3, 4)
91
91
92
- 我们在` immutable.Set ` 类型的变量中使用` += ` 和` -= ` 。诸如 ` s += 4 ` 的表达式是 ` s = s + 4 ` 的缩写,它的作用是,在集合s上运用方法 ` + ` ,并把结果赋回给变量s 。下面我们来分析可变集合上的类似操作。
92
+ 我们在` immutable.Set ` 类型的变量中使用` += ` 和` -= ` 。诸如 ` s += 4 ` 的表达式是 ` s = s + 4 ` 的缩写,它的作用是,在集合 ` s ` 上运用方法 ` + ` ,并把结果赋回给变量 ` s ` 。下面我们来分析可变集合上的类似操作。
93
93
94
94
scala> val s = collection.mutable.Set(1, 2, 3)
95
95
s: scala.collection.mutable.Set[Int] = Set(1, 2, 3)
@@ -98,17 +98,17 @@ language: zh-cn
98
98
scala> s -= 2
99
99
res4: s.type = Set(1, 4, 3)
100
100
101
- 最后结果看起来和之前的在非可变集合上的操作非常相似;从` Set(1, 2, 3) ` 开始,最后得到` Set(1, 3, 4) ` 。然而,尽管相似,但它们在实现上其实是不同的。 这里` s += 4 ` 是在可变集合值s上调用` += ` 方法,它会改变s的内容 。同样的,` s -= 2 ` 也是在s上调用 ` -= ` 方法,也会修改s集合的内容 。
101
+ 最后结果看起来和之前的在非可变集合上的操作非常相似;从` Set(1, 2, 3) ` 开始,最后得到` Set(1, 3, 4) ` 。然而,尽管相似,但它们在实现上其实是不同的。 这里` s += 4 ` 是在可变集合值s上调用` += ` 方法,它会改变 ` s ` 的内容 。同样的,` s -= 2 ` 也是在s上调用 ` -= ` 方法,也会修改 ` s ` 集合的内容 。
102
102
103
103
通过比较这两种方式得出一个重要的原则。我们通常能用一个非可变集合的变量来替换可变集合的常量,反之亦然。这一原则至少在没有别名的引用添加到Collection时起作用。别名引用主要是用来观察操作在Collection上直接做的修改还是生成了一个新的Collection。
104
104
105
- 可变集合同样提供作为` += ` 和 ` -= ` 的变型方法,add和remove,它们的不同之处在于add和remove会返回一个表明运算是否对集合有作用的Boolean值
105
+ 可变集合同样提供作为 ` += ` 和 ` -= ` 的变型方法,` add ` 和 ` remove ` ,它们的不同之处在于 ` add ` 和 ` remove ` 会返回一个表明运算是否对集合有作用的Boolean值
106
106
107
107
目前可变集合默认使用哈希表来存储集合元素,非可变集合则根据元素个数的不同,使用不同的方式来实现。空集用单例对象来表示。元素个数小于等于4的集合可以使用单例对象来表达,元素作为单例对象的字段来存储。 元素超过4个,非可变集合就用哈希前缀树(hash trie)来实现。
108
108
109
109
采用这种表示方法,较小的不可变集合(元素数不超过4)往往会比可变集合更加紧凑和高效。所以,在处理小尺寸的集合时,不妨试试不可变集合。
110
110
111
- 集合的两个特质是SortedSet和 BitSet。
111
+ 集合的两个特质是 ` SortedSet ` 和 ` BitSet ` 。
112
112
113
113
## 有序集(SortedSet)
114
114
@@ -143,7 +143,7 @@ language: zh-cn
143
143
144
144
## 位集合(Bitset)
145
145
146
- 位集合是由单字或多字的紧凑位实现的非负整数的集合。其内部使用Long型数组来表示。第一个Long元素表示的范围为0到63 ,第二个范围为64到127,以此类推(值为0到127的非可变位集合通过直接将值存储到第一个或第两个Long字段的方式 ,优化掉了数组处理的消耗)。对于每个Long ,如果有相应的值包含于集合中则它对应的位设置为1,否则该位为0。这里遵循的规律是,位集合的大小取决于存储在该集合的最大整数的值的大小。假如N是为集合所要表示的最大整数,则集合的大小就是N/64个长整形字,或者N/8个字节 ,再加上少量额外的状态信息字节。
146
+ 位集合是由单字或多字的紧凑位实现的非负整数的集合。其内部使用 ` Long ` 型数组来表示。第一个 ` Long ` 元素表示的范围为0到63 ,第二个范围为64到127,以此类推(值为0到127的非可变位集合通过直接将值存储到第一个或第两个 ` Long ` 字段的方式 ,优化掉了数组处理的消耗)。对于每个 ` Long ` ,如果有相应的值包含于集合中则它对应的位设置为1,否则该位为0。这里遵循的规律是,位集合的大小取决于存储在该集合的最大整数的值的大小。假如N是为集合所要表示的最大整数,则集合的大小就是 ` N/64 ` 个长整形字,或者 ` N/8 ` 个字节 ,再加上少量额外的状态信息字节。
147
147
148
- 因此当位集合包含的元素值都比较小时,它比其他的集合类型更紧凑。位集合的另一个优点是它的contains方法 (成员测试)、+= 运算(添加元素)、-= 运算(删除元素)都非常的高效。
148
+ 因此当位集合包含的元素值都比较小时,它比其他的集合类型更紧凑。位集合的另一个优点是它的 ` contains ` 方法 (成员测试)、` += ` 运算(添加元素)、` -= ` 运算(删除元素)都非常的高效。
149
149
0 commit comments