第十章 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)
相关文章
相关标签/搜索