Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的。
Scala 集合分为可变的和不可变的集合。
默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用
scala.collection.mutable.Set
包。
默认引用 scala.collection.immutable.Set,不可变集合实例如下:
val
set
=
Set
(
1
,
2
,
3
)
println
(
set.
getClass
.
getName
)
//
println
(
set.
exists
(
_
%
2
==
0
)
)
//true
println
(
set.
drop
(
1
)
)
//Set(2,3)
如果需要使用可变集合需要引入 scala.collection.mutable.Set:
import
scala.
collection
.
mutable
.
Set
// 可以在任何地方引入 可变集合
val
mutableSet
=
Set
(
1
,
2
,
3
)
println
(
mutableSet.
getClass
.
getName
)
// scala.collection.mutable.HashSet
mutableSet.
add
(
4
)
mutableSet.
remove
(
1
)
mutableSet +
=
5
mutableSet -
=
2
println
(
mutableSet
)
// Set(5, 3, 4)
val
another
=
mutableSet.
toSet
println
(
another.
getClass
.
getName
)
// scala.collection.immutable.Set
虽然可变Set和不可变Set都有添加或删除元素的操作,但是有一个非常大的差别。对不可变Set进行操作,会产生一个新的set,原来的set并没有改变,这与List一样。 而对可变Set进行操作,改变的是该Set本身,与ListBuffer类似。
集合基本操作
Scala集合有三个基本操作:
head
返回集合第一个元素
tail
返回一个集合,包含除了第一元素之外的其他元素
isEmpty
在集合为空时返回true
对于Scala集合的任何操作都可以使用这三个基本操作来表达。实例如下:
object
Test
{
def
main
(
args
:
Array
[
String
]
)
{
val
site
=
Set
(
"Runoob"
,
"Google"
,
"Baidu"
)
val
nums
:
Set
[
Int
]
=
Set
(
)
println
(
"第一网站是 : "
+ site.
head
)
println
(
"最后一个网站是 : "
+ site.
tail
)
println
(
"查看列表 site 是否为空 : "
+ site.
isEmpty
)
println
(
"查看 nums 是否为空 : "
+ nums.
isEmpty
)
执行以上代码,输出结果为:
$ vim Test.scala
$ scala Test.scala
第一网站是 : Runoob
最后一个网站是 : Set(Google, Baidu)
查看列表 site 是否为空 : false
查看 nums 是否为空 : true
你可以使用
++
运算符或
Set.++()
方法来连接两个集合。如果元素有重复的就会移除重复的元素。实例如下:
object
Test
{
def
main
(
args
:
Array
[
String
]
)
{
val
site1
=
Set
(
"Runoob"
,
"Google"
,
"Baidu"
)
val
site2
=
Set
(
"Faceboook"
,
"Taobao"
)
// ++ 作为运算符使用
var
site
=
site1 ++ site2
println
(
"site1 ++ site2 : "
+ site
)
// ++ 作为方法使用
site
=
site1.++
(
site2
)
println
(
"site1.++(site2) : "
+ site
)
执行以上代码,输出结果为:
$ vim Test.scala
$ scala Test.scala
site1 ++ site2 : Set(Faceboook, Taobao, Google, Baidu, Runoob)
site1.++(site2) : Set(Faceboook, Taobao, Google, Baidu, Runoob)
查找集合中最大与最小元素
你可以使用
Set.min
方法来查找集合中的最小元素,使用
Set.max
方法查找集合中的最大元素。实例如下:
object
Test
{
def
main
(
args
:
Array
[
String
]
)
{
val
num
=
Set
(
5
,
6
,
9
,
20
,
30
,
45
)
// 查找集合中最大与最小元素
println
(
"Set(5,6,9,20,30,45) 集合中的最小元素是 : "
+ num.
min
)
println
(
"Set(5,6,9,20,30,45) 集合中的最大元素是 : "
+ num.
max
)
执行以上代码,输出结果为:
$ vim Test.scala
$ scala Test.scala
Set(5,6,9,20,30,45) 集合中的最小元素是 : 5
Set(5,6,9,20,30,45) 集合中的最大元素是 : 45
交集
你可以使用
Set.&
方法或
Set.intersect
方法来查看两个集合的交集元素。实例如下:
object
Test
{
def
main
(
args
:
Array
[
String
]
)
{
val
num1
=
Set
(
5
,
6
,
9
,
20
,
30
,
45
)
val
num2
=
Set
(
50
,
60
,
9
,
20
,
35
,
55
)
// 交集
println
(
"num1.&(num2) : "
+ num1.
&
(
num2
)
)
println
(
"num1.intersect(num2) : "
+ num1.
intersect
(
num2
)
)
执行以上代码,输出结果为:
$ vim Test.scala
$ scala Test.scala
num1.&(num2) : Set(20, 9)
num1.intersect(num2) : Set(20, 9)
Scala Set 常用方法
下表列出了 Scala Set 常用的方法:
方法及描述
def +(elem: A): Set[A]
为集合添加新元素,x并创建一个新的集合,除非元素已存在
def -(elem: A): Set[A]
移除集合中的元素,并创建一个新的集合
def contains(elem: A): Boolean
如果元素在集合中存在,返回 true,否则返回 false。
def &(that: Set[A]): Set[A]
返回两个集合的交集
def &~(that: Set[A]): Set[A]
返回两个集合的差集
def +(elem1: A, elem2: A, elems: A*): Set[A]
通过添加传入指定集合的元素创建一个新的不可变集合
def ++(elems: A): Set[A]
合并两个集合
def -(elem1: A, elem2: A, elems: A*): Set[A]
通过移除传入指定集合的元素创建一个新的不可变集合
def addString(b: StringBuilder): StringBuilder
将不可变集合的所有元素添加到字符串缓冲区
def addString(b: StringBuilder, sep: String): StringBuilder
将不可变集合的所有元素添加到字符串缓冲区,并使用指定的分隔符
def apply(elem: A)
检测集合中是否包含指定元素
def count(p: (A) => Boolean): Int
计算满足指定条件的集合元素个数
def copyToArray(xs: Array[A], start: Int, len: Int): Unit
复制不可变集合元素到数组
def diff(that: Set[A]): Set[A]
比较两个集合的差集
def drop(n: Int): Set[A]]
返回丢弃前n个元素新集合
def dropRight(n: Int): Set[A]
返回丢弃最后n个元素新集合
def dropWhile(p: (A) => Boolean): Set[A]
从左向右丢弃元素,直到条件p不成立