文档章节

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

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2016/04/18 13:48
字数 864
阅读 1177
收藏 0

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)



© 著作权归作者所有

阿拉德大陆的魔法师
粉丝 27
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
第十章 Scala 容器基础(二十三):使用zip合并两个集合为二元组集合

Problem 你想要合并两个有序集合成为一个键值对集合 Solution 使用zip方法合并两个集合: scala> val women = List("Wilma", "Betty")women: List[String] = List(Wilma, Betty) scala> val......

阿拉德大陆的魔法师
2016/04/18
251
0
第十章 Scala 容器基础(七):用Vector作为你指定的不可变序列

问题: 你需要为你的Scala应用选择一个快速,通用的不可变序列集合类型,那么该如何选择呢? 解决: Vecotr类目前可以被认为是这么一个通用的不可变数据结构。Vector是一个带索引的不可变序列...

阿拉德大陆的魔法师
2016/04/10
1K
0
第十章 Scala 容器基础(九):使用foreach来遍历一个集合

Problem 如何使用foreach方法来遍历一个集合中的所有元素 Solution 方法foreach使用函数作为参数。这个函数的定义应该使用一个集合元素作为输入参数,同时不应该有返回值。并且这个函数的输入...

阿拉德大陆的魔法师
2016/04/10
2.8K
0
第十章 Scala 容器基础(十八):从集合中提取元素序列

Problem 你想要从集合中提取一串连续的元素,通过指定开始和结束位置或者通过一个方法。 Solution 你可以利用一些集合方法来从有序集合中提取一串连续的元素。比如drop,dropWhile,head,h...

阿拉德大陆的魔法师
2016/04/14
1K
0
第十章 Scala 容器基础(二十七):元组

Problem 你想要创建一个集合,集合元素类型是多样的。 Solution 元组为你提供了一种方式来存储不同类型的元素在一个容器内,这在许多情况下是非常有用的。 新建一个元祖通过把需要的额元组包...

阿拉德大陆的魔法师
2016/04/19
108
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
6
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部