位置:首頁 > 高級語言 > Scala教學 > Scala Sets

Scala Sets

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
查找最大的元素。
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
返回對象的字符串表示。