Scala Sets

于2017-07-06由小牛君创建

分享到:


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集合方法:

以下是可以同时使用集合的重要方法。有关可用方法的完整列表,请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
查找最大的元素。