第十章 Scala 容器基礎(二十二):合併有序集合

Problem

    你想要把兩個集合合併爲一個集合,要麼包含兩集合全部的元素,要麼包含兩個集合的相同元素,要麼包含兩個集合的不一樣元素。
數組

Solution

    對於這個問題有不少解決方案,用哪一種取決於你的須要:
併發

  • 使用++=方法能夠合併一個集合到一個mutable集合scala

  • 使用++方法能夠合併兩個mutable或者immutable集合code

  • 使用結合的方法union,diff,intersect
    io

    使用++=方法來合併集合到一個mutable集合,好比ArrayBuffertable

scala> val a = collection.mutable.ArrayBuffer(1,2,3)
a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

scala> a ++= Seq(4,5,6)
res15: a.type = ArrayBuffer(1, 2, 3, 4, 5, 6)

    使用++方法來合併兩個mutable或者immutable變量,併發返回的結果指定給一個新的變量class

scala> val a = Array(1,2,3)
a: Array[Int] = Array(1, 2, 3)

scala> val b = Array(4,5,6)
b: Array[Int] = Array(4, 5, 6)

scala> val c = a ++ b
c: Array[Int] = Array(1, 2, 3, 4, 5, 6)

    你一樣可使用union和intersect方法來合併兩個集合:變量

scala> val a = Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5)

scala> val b = Array(4,5,6,7,8)
b: Array[Int] = Array(4, 5, 6, 7, 8)

scala> val c = a.intersect(b)
c: Array[Int] = Array(4, 5)

scala> a union b
res16: Array[Int] = Array(1, 2, 3, 4, 5, 4, 5, 6, 7, 8)

scala> a.union(b).distinct
res17: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8)

    diff方法的返回結果取決於哪一個集合被調用List

scala> a.diff(b)
res19: Array[Int] = Array(1, 2, 3)

scala> b.diff(a)
res20: Array[Int] = Array(6, 7, 8)

    Scaladoc對diff方法返回值的說明,「一個新的集合,包含被調用集合的全部不在參數集合中出現的元素。若是一個元素在被調集合中出現了n次,在參數集合中出現了m次,那麼這個元素會在結果集合中出現n-m(若是n-m<=0那麼爲0)次。"nio

    可使用Array.concat來連接兩個數組:

scala> val a = Array(1,2,3,4)
a: Array[Int] = Array(1, 2, 3, 4)

scala> val b = Array(4,5,6,7)
b: Array[Int] = Array(4, 5, 6, 7)

scala> Array.concat(a,b)
res27: Array[Int] = Array(1, 2, 3, 4, 4, 5, 6, 7)

    你還可使用:::來鏈接兩個List的元素:

scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)

scala> val b = List(4,5,6,7)
b: List[Int] = List(4, 5, 6, 7)

scala> val c = a ::: b
c: List[Int] = List(1, 2, 3, 4, 4, 5, 6, 7)

Discussion

    接下來咱們須要找到在一個集合中而不在另外一個集合中的全部元素,先把集合轉化爲一個Set,而後再調用diff方法來對比兩個Set:

scala> val a = Array(1,2,3,11,4,12,4,5)
a: Array[Int] = Array(1, 2, 3, 11, 4, 12, 4, 5)

scala> val b = Array(6,7,4,5)
b: Array[Int] = Array(6, 7, 4, 5)

scala> val c = a.toSet diff b.toSet
c: scala.collection.immutable.Set[Int] = Set(1, 2, 12, 3, 11)

scala> val d = b.toSet diff a.toSet
d: scala.collection.immutable.Set[Int] = Set(6, 7)

    接下來咱們合併兩個新集合,新集合元素即爲在集合a中,也在集合b中,可是不一樣時存在於集合a,b中。由於diff做用在Set上,會返回一個新的Set包含在被調集合中而不在傳入集合中的元素,而且Set中元素都是惟一的。

scala> val complement = c ++ d
complement: scala.collection.immutable.Set[Int] = Set(1, 6, 2, 12, 7, 3, 11)

    咱們還能夠經過減去集合的交集來達到一樣的效果:

scala> val i = a.intersect(b)
i: Array[Int] = Array(4, 5)

scala> val c = a.toSet - i.toSet
c: scala.collection.immutable.Set[Any] = Set(5, 1, 2, 12, 3, 11, 4)

scala> val d = b.toSet - i.toSet
d: scala.collection.immutable.Set[Any] = Set(6, 7, 4, 5)
相關文章
相關標籤/搜索