2019独角兽企业重金招聘Python工程师标准>>>

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)

转载于:https://my.oschina.net/nenusoul/blog/661707

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

  1. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  2. 计算机基础函数运用,计算机应用基础第十二讲:EXCEL中函数的实际运用.doc

    文档介绍: 计算机应用基础第十二讲:EXCEL中函数的实际运用.doc计算机应用基础第十二讲:EXCEL中函数的实际运用课 题EXCEL屮函数的实际运用课型多媒体课授课时间第20周教学目的实例分析,掌 ...

  3. 零基础带你学习MySQL—单行子查询和多行子查询(二十二)

    零基础带你学习MySQL-多行子查询(二十二) 一.什么是子查询? 子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询 二.什么是单行子查询? 单行子查询是指只返回一行数据的子查 ...

  4. Python入门(二十二)- 常见模块2(正则表达式及容器)

    二十二 常见模块2(正则表达式及容器) 22.1 正则表达式及re模块 正则表达式(Regular Expression)用于描述一种字符串匹配模式(Pattern),它可以用于检查一个字符串是否含有 ...

  5. LINUX学习基础篇(二十二)硬盘结构

    LINUX学习基础篇(二十二)文件系统管理 硬盘 磁盘结构 硬盘接口 硬盘 磁盘结构 扇区是磁盘的最小存储单位,每个扇区的大小是固定的,为512Byte.硬盘里有多个磁盘,每个磁盘中,有多个同心圆,这 ...

  6. python基础(十二):字符字节编码解码

    基础(十二) 字符串概述 类型 编码架构 字符串存储 常用字符编码 ASCII latin-1 UTF-8(通用性更好) UTF-16 UTF-32 内置函数 ord() chr() str.enco ...

  7. 自然语言处理系列二十二》词性标注》词性标注原理》词性介绍

    注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书<分布式机器学习实战>(人工智能科学与技术丛书)[陈敬雷编著][清华大学出版社] 文章目录 自然语言处理系列二十二 词性 ...

  8. GUI的演化和python编程——Python学习笔记之二十二

    GUI的演化和python编程--Python学习笔记之二十二 写完了有关长寿的两篇博文,本该去完成哥德尔那个命题六的.对计算机图形界面的好奇,让我把注意力暂时离开那个高度抽象难读的哥德尔,给转到计算 ...

  9. (二十二)访问者模式详解(伪动态双分派) - 转

    作者:zuoxiaolong8810(左潇龙),转载请注明出处. 本次LZ和各位分享一下访问者模式,从场景.设计初衷以及实现方面来说,访问者模式算是LZ即将写到的24种设计模式当中,最复杂也是最难理解 ...

  10. 数字符号哥德尔数配置及变元、公式和谓词散议——哥德尔读后之二十二

    数字符号哥德尔数配置及变元.公式和谓词散议--哥德尔读后之二十二 这篇博文折腾了我近一个月,广州从8月以来几乎天天都在摄氏35度的酷热之中,满以为在秋凉之前可以完成,可你要从阅读哥德尔原著中找到些感觉 ...

最新文章

  1. Go 语言编程 — Cobra 指令行工具
  2. ios应用,64位问题,Missing 64-bit support
  3. ajax将数据显示在class为content的标签中_利用selenium实现自动翻页爬取某鱼数据
  4. 深藏不露!下拉列表设计灵感
  5. 移动OA平台现状(移动运营商)
  6. Python之十点半小游戏
  7. 从Google到Facebook再到微博,算法与数据中台大咖谈
  8. 获取一个类的信息(仿YYClassInfo类)
  9. Python实现微信小游戏:飞机大战
  10. 静态HTML网页模板源码——仿男装女装购物商城(40页功能齐全)
  11. 终级免杀之PcShare Vs KV2006
  12. 2020年日历_2020年日历全年表
  13. 30岁后的测试工程师都去哪儿了?
  14. zookeeper 数据节点的增删改查
  15. 虚拟内存、虚拟地址-页-页号、物理地址-页框-页框号
  16. 小程序跳到h5页面_小程序如何跳转h5页面
  17. SLAM流程之视觉前端
  18. 客户端连接linux的MySQL数据库出现被自己拒绝的错误
  19. 字符串解码(猿辅导笔试题数箱子)
  20. 6.18大促,看蚂蚁智能客服如何帮你快人一步

热门文章

  1. 编程求一个四位自然数ABCD,它乘以A后变成DCBA
  2. linux内核程序运行在哪里,linux内核 – 设备驱动程序代码在哪里执行?内核空间还是用户空间?...
  3. bps与bit/s和Bps与buad/s
  4. ajax如何获取复选框中的值_Web自动化测试:页面元素信息(属性)的获取
  5. C++输出全排列递归算法详细解释
  6. 云计算数据中心网络性能测试
  7. 部分关键字--this/extends/super/static/final/abstract/访问权限总结
  8. 【转】程序员:如何写出杀手级简历
  9. 网页素材精品:一组五彩缤纷的免费矢量背景素材
  10. 使用安全json parser防止json注入