第十章 Scala 容器基础(二十二):合并有序集合

原创
2016/04/18 13:48
阅读数 4.2K

Problem

    你想要把两个集合合并为一个集合,要么包含两集合所有的元素,要么包含两个集合的相同元素,要么包含两个集合的不同元素。

Solution

    对于这个问题有很多解决方案,用哪种取决于你的需要:

  • 使用++=方法可以合并一个集合到一个mutable集合

  • 使用++方法可以合并两个mutable或者immutable集合

  • 使用结合的方法union,diff,intersect

    使用++=方法来合并集合到一个mutable集合,比如ArrayBuffer

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变量,并发返回的结果指定给一个新的变量

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方法的返回结果取决于哪个集合被调用

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)次。"

    可以使用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)



展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部