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 返回對象的字符串表示。 |