Scala集合为相同类型的配对的不同元素的集合。换句话说,集合是不包含重复元素的集合。有两种集合,不可改变的和可变的。可变和不可变的对象之间的区别在于,当一个对象是不可变的,对象本身不能被改变。
默认情况下,Scala中使用不可变的集。如果想使用可变集,必须明确地导入scala.collection.mutable.Set类。如果想在同一个同时使用可变和不可变的集合,那么可以继续参考不变的集合,但可以参考可变设为mutable.Set。以下是声明不变集合示例:
// Empty set of integer type var s : Set[Int] = Set() // Set of integer type var s : Set[Int] = Set(1,3,5,7) or var s = Set(1,3,5,7)
在定义空集,类型注释是必要的,因为系统需要指定一个具体的类型变量。
集合所有操作可以体现在以下三个方法:
| 方法 | 描述 |
|---|---|
| head | 此方法返回集合的第一个元素。 |
| tail | 该方法返回集合由除第一个以外的所有元素。 |
| isEmpty | 如果设置为空,此方法返回true,否则为false。 |
以下是上述方法中的例子显示的用法:
object Test {
def main(args: Array[String]) {
val fruit = Set("apples", "oranges", "pears")
val nums: Set[Int] = Set()
println( "Head of fruit : " + fruit.head )
println( "Tail of fruit : " + fruit.tail )
println( "Check if fruit is empty : " + fruit.isEmpty )
println( "Check if nums is empty : " + nums.isEmpty )
}
}
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala C:/>scala Test Head of fruit : apples Tail of fruit : Set(oranges, pears) Check if fruit is empty : false Check if nums is empty : true C:/>
可以使用++运算符或集。++()方法来连接两个或多个集,但同时增加了集它会删除重复的元素。以下是这个例子来连接两个集合:
object Test {
def main(args: Array[String]) {
val fruit1 = Set("apples", "oranges", "pears")
val fruit2 = Set("mangoes", "banana")
// use two or more sets with ++ as operator
var fruit = fruit1 ++ fruit2
println( "fruit1 ++ fruit2 : " + fruit )
// use two sets with ++ as method
fruit = fruit1.++(fruit2)
println( "fruit1.++(fruit2) : " + fruit )
}
}
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala C:/>scala Test fruit1 ++ fruit2 : Set(banana, apples, mangoes, pears, oranges) fruit1.++(fruit2) : Set(banana, apples, mangoes, pears, oranges) C:/>
可以使用Set.min方法找出最小元素,Set.max方法找出一组可用最大元素。以下为例子来说明的用法:
object Test {
def main(args: Array[String]) {
val num = Set(5,6,9,20,30,45)
// find min and max of the elements
println( "Min element in Set(5,6,9,20,30,45) : " + num.min )
println( "Max element in Set(5,6,9,20,30,45) : " + num.max )
}
}
让我们编译和运行上面的程序,这将产生以下结果:
C:/>scalac Test.scala C:/>scala Test Min element in Set(5,6,9,20,30,45) : 5 Max element in Set(5,6,9,20,30,45) : 45 C:/>
可以使用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)
// find common elements between two sets
println( "num1.&(num2) : " + num1.&(num2) )
println( "num1.intersect(num2) : " + num1.intersect(num2) )
}
}
让我们编译和运行上面的程序,这将产生以下结果:
C:/>scalac Test.scala C:/>scala Test num1.&(num2) : Set(20, 9) num1.intersect(num2) : Set(20, 9) C:/>
以下是可以同时使用集合的重要方法。有关可用方法的完整列表,请Scala官方文档。
| SN | 方法及描述 |
|---|---|
| 1 |
def +(elem: A): Set[A] 创建一组新的具有附加元件,除非该元件已经存在 |
| 2 |
def -(elem: A): Set[A] 创建一个新的从这个集合中删除一个给定的元素 |
| 3 |
def contains(elem: A): Boolean 如果elem包含在这个集合返回true,否则为false。 |
| 4 |
def &(that: Set[A]): Set[A] 返回新的集合组成在这个集合,并在给定的集合,所有的元素。 |
| 5 |
def &~(that: Set[A]): Set[A] 返回此集合和另一个集合的差异 |
| 6 |
def +(elem1: A, elem2: A, elems: A*): Set[A] 创建一个新的不可变的集合与来自传递集合额外的元素 |
| 7 |
def ++(elems: A): Set[A] 连接此不可变的集合使用另一个集合到这个不可变的集合的元素。 |
| 8 |
def -(elem1: A, elem2: A, elems: A*): Set[A] 返回包含当前不可变的集合,除了每一个给定参数的元素之一,较少出现的所有元素的不可变的集合。 |
| 9 |
def addString(b: StringBuilder): StringBuilder 这追加不可变的集到一个字符串生成器的所有元素。 |
| 10 |
def addString(b: StringBuilder, sep: String): StringBuilder 这追加不可变的集合使用分隔字符串一个字符串生成器的所有元素。 |
| 11 |
def apply(elem: A) 测试如果一些元素被包含在这个集合。 |
| 12 |
def count(p: (A) => Boolean): Int 计算在不可变的集合满足谓词的元素数。 |
| 13 |
def copyToArray(xs: Array[A], start: Int, len: Int): Unit 这种不可变的集合到一个数组的副本元素。 |
| 14 |
def diff(that: Set[A]): Set[A] 计算这组和另一组的差异。 |
| 15 |
def drop(n: Int): Set[A]] 返回除了第n个的所有元素。 |
| 16 |
def dropRight(n: Int): Set[A] 返回除了最后的n个的所有元素。 |
| 17 |
def dropWhile(p: (A) => Boolean): Set[A] 丢弃满足谓词的元素最长前缀。 |
| 18 |
def equals(that: Any): Boolean equals方法的任意序列。比较该序列到某些其他对象。 |
| 19 |
def exists(p: (A) => Boolean): Boolean 测试谓词是否持有一些这种不可变的集合的元素。 |
| 20 |
def filter(p: (A) => Boolean): Set[A] 返回此不可变的集合满足谓词的所有元素。 |
| 21 |
def find(p: (A) => Boolean): Option[A] 找到不可变的集合满足谓词,如有第一个元素 |
| 22 |
def forall(p: (A) => Boolean): Boolean 测试谓词是否持有这种不可变的集合中的所有元素。 |
| 23 |
def foreach(f: (A) => Unit): Unit 应用一个函数f这个不可变的集合中的所有元素。 |
| 24 |
def head: A 返回此不可变的集合的第一个元素。 |
| 25 |
def init: Set[A] 返回除了最后的所有元素。 |
| 26 |
def intersect(that: Set[A]): Set[A] 计算此set和另一组set之间的交叉点。 |
| 27 |
def isEmpty: Boolean 测试此集合是否为空。 |
| 28 |
def iterator: Iterator[A] 创建一个新的迭代器中包含的可迭代对象中的所有元素。 |
| 29 |
def last: A 返回最后一个元素。 |
| 30 |
def map[B](f: (A) => B): immutable.Set[B] 通过应用函数这一不可变的集合中的所有元素构建一个新的集合。 |
| 31 |
def max: A 查找最大的元素。 |
| 32 |
def min: A 查找最小元素。 |
| 33 |
def mkString: String 显示此不可变的集合字符串中的所有元素。 |
| 34 |
def mkString(sep: String): String 显示此不可变的集合在一个字符串使用分隔字符串的所有元素。 |
| 35 |
def product: A 返回此不可变的集合相对于*操作在num的所有元素的产物。 |
| 36 |
def size: Int 返回此不可变的集合元素的数量。 |
| 37 |
def splitAt(n: Int): (Set[A], Set[A]) 返回一对不可变的集合组成这个不可变的集的前n个元素,以及其他元素。 |
| 38 |
def subsetOf(that: Set[A]): Boolean 返回true,如果此set就是一个子集,也就是说,如果这集合的每个元素也是一个元素。 |
| 39 |
def sum: A 返回此不可变的集合的所有元素的总和使用对于+运算符在num。 |
| 40 |
def tail: Set[A] 返回一个不可变的集合组成这个不可变的集合的所有元素,除了第一个。 |
| 41 |
def take(n: Int): Set[A] 返回前n个元素。 |
| 42 |
def takeRight(n: Int):Set[A] 返回最后n个元素。 |
| 43 |
def toArray: Array[A] 返回一个包含此不可变的集合的所有元素的数组。 |
| 44 |
def toBuffer[B >: A]: Buffer[B] 返回一个包含此不可变的集合中的所有元素的缓冲区。 |
| 45 |
def toList: List[A] 返回一个包含此不可变的集合中的所有元素的列表。 |
| 46 |
def toMap[T, U]: Map[T, U] 这种不可变的集合转换为映射 |
| 47 |
def toSeq: Seq[A] 返回一个包含此不可变的集的所有元素的序列。 |
| 48 |
def toString(): String 返回对象的字符串表示。 |