首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Scala 高阶(八):集合内容汇总(下篇)

Scala 高阶(八):集合内容汇总(下篇)

作者头像
百思不得小赵
发布于 2022-12-01 06:47:23
发布于 2022-12-01 06:47:23
70200
代码可运行
举报
文章被收录于专栏:小赵Java总结小赵Java总结
运行总次数:0
代码可运行

大家好,我是百思不得小赵。

创作时间:2022 年 7 月 18 日 博客主页: 🔍点此进入博客主页 —— 新时代的农民工 🙊 —— 换一种思维逻辑去看待这个世界 👀


文章目录


在上一篇集合的分享中,讲解了Scala中集合的基本概述以及常用集合的基本操作,本次住要分享Scala中集合更高级的操作。

一、集合常用函数

基本操作

  • 获取集合长度和大小:线性集合length,所有集合都有size
  • 循环遍历:for (elem <- collection)
  • 迭代器:for (elem <- collection.iterator)
  • 生成字符串:list.toString / mkString
  • 判断包含:list.contains()

代码实操:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 创建集合
    val list = List(12,21,98,78,65,90)
    
    // 长度
    println(list.length)
    
    // 大小
    println(list.size)
    
    // 遍历
    list.foreach(println)
    
    for (elem <- list){
      println(elem)
    }
    
    for (elem <- list.iterator){
      println(elem)
    }
    
    // 生成字符串
    println(list.mkString("-"))
    
    // 判断包涵
    println(list.contains(12))

衍生集合

  • 获取集合的头head,除过头之外的都是尾tail
  • 集合最后一个数据last,除过最后一个元素的初始数据init
  • 反转reverse
  • 取前(后)n 个元素 take(n) takeRight(n)
  • 去掉前(后)n 个元素 drop(n) dropRight(n)
  • 并集 list1.union(list2) Set做并集的话会进行去重操作。
  • 交集 list1.intersect(list2)
  • 差集 list1.diff(list2)
  • 拉链 list1.zip(list2) 将两个集合对应位置的元素进行配对成一个二元组,大小不匹配会丢掉其中一个集合不匹配的多余部分。
  • 滑窗. list.sliding(n, step = 1) 框住特定个数元素,方便移动和操作,得到的是一个迭代器,进行遍历输出结果。步长:当前窗口每次滑动的范围,窗口之间相隔的距离为滑动步长

代码实操:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 val list1 = List(12, 34, 56, 32, 24, 45)
    val list2 = List(45, 23, 89, 97, 56, 36)
    // 头
    println(list1.head)
    // 尾
    println(list1.tail)
    // 最后一个元素
    println(list1.last)
    // 除过最后一个元素
    println(list1.init)
    // 反转
    println(list1.reverse)
    // 前(后)n 个元素
    println(list1.take(2))
    println(list1.takeRight(4))
    // 去掉前(后)n 个元素
    println(list1.drop(1))
    println(list1.dropRight(1))
    // 交集
    println(list1.intersect(list2))
    // 并集
    println(list1.union(list2))
    // 差集
    println(list1.diff(list2))
    // 拉链
    println(list1.zip(list2))
    // 滑窗
    println(list1.sliding(3, 2).foreach(println))

简单计算函数

  • 求和 sum 求乘积 product 最大值 min 最小值 max
  • maxBy(函数)可以传入一个函数来获取元素返回比较依据的值。元组默认判断第一个元素进行比较,可以修改比较规则使用第二个元素进行判断。
  • 排序 sorted默认从小到大排序,从大到小排序list.sorted(Ordering[Int].reverse)
  • sortBy(函数)对一个属性或多个属性进行排序,传入隐式参数逆序排序sortBy(函数)(Ordering[Int].reverse)
  • sortWith(比较规则)基于函数的排序,通过一个 comparator 函数,实现自定义排序的逻辑。

实操代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
object Test_SimpleFunction {
  def main(args: Array[String]): Unit = {
    // 创建集合
    val list = List(12, 90, 45, 34, 23, 65)
    val list2 = List(("a", 1), ("b", 4), ("c", 5), ("d", 2), ("e", 9))

    // 求和
    println(list.sum)
    // 求乘积
    println(list.product)
    // 最大值
    println(list.max)
    println(list2.maxBy((tuple: (String, Int)) => tuple._2))
    println(list2.maxBy(_._2))

    // 最小值
    println(list.min)
    println(list2.minBy(_._2))

    // 排序
    // 默认从小到大排列
    val sorted = list.sorted
    println(sorted)
    // 从大到小排列
    println(list.sorted.reverse) // 效率太低
    // 传入隐式参数排序 改变排序规则 默认从小到大
    list.sorted(Ordering[Int].reverse)

    println(list2.sortBy(_._2))
    println(list2.sortBy(_._2)(Ordering[Int].reverse))

    // sortWith
    println(list.sortWith( (a: Int,b: Int) => a < b ))
    println(list.sortWith( (a,b) => a < b ))
    println(list.sortWith( _<_ ))
  }
}

高级计算函数

  • 数据处理的核心为两个方面:规约和映射。

Map操作:

  • 过滤 filter(过滤条件):遍历一个集合并从中获取满足指定条件的元素组成一个新的集合
  • 映射map(自定义映射函数):将集合中的每一个元素映射到某一个函数
  • 扁平化flatten 将集合中集合元素拆开,去掉里层集合,放到外层中来.
  • 扁平映射 flatMap(). 相当于先进行 map 操作,在进行 flatten 操作
  • 分组 groupBy(分组规则) 按照指定的规则对集合的元素进行分组

Reduce操作:

  • 简化/规约 reduce 对所有数据做一个处理,规约得到一个结果.
  • 折叠 fold 给定一个初始值,从弟一个元素开始计算

实操代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 	val list = List(12, 23, 78, 65, 34)

    // 过滤  选取偶数
    println(list.filter((elem: Int) => elem % 2 == 0))
    // 简化
    println(list.filter(_ % 2 == 0))

    // 狭义上的Map操作,把每一个元素做一个转化得到新的集合,相当于集合的映射关系
    // 每个元素✖️2
    list.map(elem => elem * 2)

    // 扁平化
    val newList = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
    println(newList.flatten)

    // 扁平映射
    // 将一组字符串进行分词,并保存成单词的列表
    val strings = List("hello world", "hello scala", "hello java")
    // 分词
    val splitList = strings.map(string => string.split(" "))
    // 打散 扁平化
    println(splitList.flatten)

    println(strings.flatMap(_.split(" ")))

    // 分组 groupBy
    // 分成奇偶两组
    println(list.groupBy(_ % 2))
    println(list.groupBy(data => if (data % 2 == 0) "偶数" else "奇数"))

    val wordList = List("asd", "cdffd", "bfrf", "ascd")
    println(wordList.groupBy(_.charAt(0)))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	 val list = List(1, 2, 3, 4, 5)

    // reduce
    println(list.reduce(_ + _))
    println(list.reduceLeft(_ + _))

    val list2 = List(3, 4, 5, 7, 8, 80)
    println(list2.reduce(_ - _))
    println(list2.reduceLeft(_ - _))
    // 底层由递归实现
    println(list2.reduceRight(_ - _)) //3 - (4 - (5- (7- (8-90))))

    //fold
    println(list.fold(10)(_ - _)) // 10-1-2-3-4-5
    println(list.foldLeft(10)(_ - _))
    println(list.foldRight(11)(_ - _))

WordCount案例

案例需求

单词计数:将集合中出现的相同的单词,进行计数,取计数排名前三的结果

分析过程

图片来源于网络

实操代码: 经典版本的wordCount

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
object Test_CommonWordCount {
  def main(args: Array[String]): Unit = {
    // 创建单词集合
    val strings = List(
      "hello",
      "hello world",
      "hello scala",
      "hello scala spark",
      "hello scala spark flink"
    )

    // 对字符串进行拆分
    val wordList = strings.flatMap(_.split(" "))

    // 相同单词分组
    val groupMap = wordList.groupBy(word => word)

    // 对分组后List取长度,得到单词的个数
    val countMap = groupMap.map(kv => (kv._1, kv._2.length))

    // 将map转换为List , 通过count进行排序 取前三
    val sortList = countMap.toList
      .sortWith(_._2 > _._2)
      .take(3)

    println(sortList)
  }
}

复杂版的wordCount

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
object Test_ComplexWordCount {
  def main(args: Array[String]): Unit = {
    // 创建单词集合
    val tupleList = List(
      ("hello", 1),
      ("hello world", 3),
      ("hello scala", 4),
      ("hello scala spark", 7),
      ("hello scala spark flink",5)
    )

    // 解法一:直接展开为普通版本
    val stringList = tupleList.map(
      kv => {
        (kv._1.trim + " ") * kv._2
      }
    )

    val wordCountList = stringList
      .flatMap(_.split(" "))
      .groupBy(word => word)
      .map(kv => (kv._1, kv._2.length))
      .toList
      .sortBy(_._2)(Ordering[Int].reverse)
      .take(3)

    println(wordCountList)

    // 解法二:基于预统计的结果进行转换
    // 将字符串打散为单词
    val preCountlist=tupleList.flatMap(
      tuple => {
        val tuples = tuple._1.split(" ")
          .map(word => (word, tuple._2))
        tuples
      }
    )

    // 对二元组进行单词进行分组
    val preCountMap = preCountlist.groupBy(tuple => tuple._1)

    // 叠加每个单词统计的个数值
    val countMap = preCountMap.mapValues(
      tupleList => tupleList.map(_._2).sum
    )

    // 转换成List 排序输出
    val countList = countMap.toList
      .sortWith(_._2 > _._2)
      .take(3)

    println(countList)
  }
}

二、队列

Scala 也提供了队列(Queue)的数据结构,队列的特点就是先进先出。进队和出队的方法分别为 enqueuedequeue

实操代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 创建 可变队列
    val queue = new mutable.Queue[String]()

    // 入队操作
    println(queue.enqueue("a", "b", "c"))

    // 出队操作
    println(queue)
    println(queue.dequeue())
    println(queue)
    println(queue.dequeue())
    println(queue)

    // 创建不可变的队列
    val queue2 = Queue("q","b","c")
    // 入队列
    val queue3 = queue2.enqueue("d")
    println(queue3)
    // 出队
    val dequeue = queue2.dequeue
    println(dequeue)

三、并行集合

Scala 为了充分使用多核 CPU,提供了并行集合(有别于前面的串行集合),用于多核环境的并行计算

实操代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
object Test_Parallel {
  def main(args: Array[String]): Unit = {
    // 串行
    val result = (1 to 100).map(
      x => Thread.currentThread().getName
    )
    println(result)

    // 并行计算
    val result2 = (1 to 100).par.map(
      x => Thread.currentThread().getId
    )
    println(result2)
  }
}

本次Scala集合总结分享到这里就结束了,希望对大家学习Scala语言有所帮助!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
芯片短缺等问题让新能源车价格上涨
中国汽车工业协会11日公布的最新数据显示,今年2月份,我国新能源汽车产销分别完 成36.8万辆和33.4万 辆 ,同比分别增长2倍 和 1.8倍。在新能源车销量大增的同时,不少车企近期也纷纷上调价格。
电子交流圈
2022/03/22
4880
充电桩呈爆发式增长 换电站数量翻番
根据中国汽车工业协会的统计,2021年我国新能源汽车产销量双双突破350万辆,同比均增长1.6倍。那么,充换电基础设施建设情况如何?能否跟上新能源汽车发展的步伐?运营商主要有哪些?近日,中国电动汽车充电基础设施促进联盟(以下简称“联盟”)公布了2021年电动汽车充换电基础设施运行情况,从中可以找到一些答案。
恩泽能源
2022/02/10
4000
工信部支持新能源车等产业发展 采取审慎包容监管
工信部副部长辛国斌21日在中国新闻社主办的国是论坛2017年会上表示,采取审慎包容监管,支持新一代信息技术、新能源汽车、生物技术、新材料、虚拟现实、人工智能的发展壮大。 今年以来,我国新能源汽车继续保持高速发展态势。12月11日,中国汽车工业协会发布了今年11月我国汽车产销最新数据。其中,11月新能源汽车产量12.2万辆同比增长70.1%,销量11.9万辆同比增长83%。1-11月,新能源汽车累计产销量达63.9万辆和60.9万辆,超过2016年全年的总量。此外,在《双积分管理办法》的倒逼下,外资企业在我国
企鹅号小编
2018/01/31
5380
工信部支持新能源车等产业发展 采取审慎包容监管
汽车安全传感器守护新能源汽车电池安全
近日,中国汽车工业协会(以下简称中汽协)公布数据显示,10月,新能源汽车产销分别达到98.9万辆和95.6万辆,环比分别增长12.5%和5.7%,同比分别增长29.2%和33.5%,市场占有率达到33.5%;1至10月,新能源汽车产销累计完成735.2万辆和728万辆,同比分别增长33.9%和37.8%,市场占有率达到30.4%。随着第四季度传统销售旺季的到来,新能源汽车市场将迎来新的发展机遇。预计全年销量将突破900万辆,全国新能源车保有量也将突破2000万辆的大关。这不仅将为汽车市场注入新的活力,也将为推动环保、节能事业的发展做出重要贡献。
传感技术
2023/11/22
2560
《新能源汽车产业发展规划(2021-2035年)》发布:鼓励“换电” 2025年销量占比达20%
近日,国务院办公厅发布了《新能源汽车产业发展规划(2021-2035年)》(以下简称《规划》)。文件指出,我国新能源汽车发展仍面临核心技术创新能力不强、质量保障体系有待完善、基础设施建设仍显滞后、产业生态尚不健全、市场竞争日益加剧等问题。为推动新能源汽车产业高质量发展,加快建设汽车强国,制定本规划。
镁客网
2020/11/06
3500
《新能源汽车产业发展规划(2021-2035年)》发布:鼓励“换电” 2025年销量占比达20%
谁会是新能源车险市场的“鲶鱼”?
1、新能源车险是保障用户权益的重要配套产品,但“车主喊贵,险企喊亏”的现状,仍是当前新能源车险市场发展的突出瓶颈。
腾讯研究院
2023/11/16
3030
谁会是新能源车险市场的“鲶鱼”?
【喂饭级教程】开发效率翻倍!让大模型API为你打造虚拟导师!
大家好,我是程序员小灰,最近一直在关注人工智能的发展。大家有没有发现,近几年 AI 尤其是在自然语言处理方面进步特别快?比如说 GPT-4,这些模型在生成和理解文本方面表现得特别厉害,可以处理海量数据,还能进行复杂的推理。
小灰
2024/07/12
1810
【喂饭级教程】开发效率翻倍!让大模型API为你打造虚拟导师!
恒大汽车启动夏季极限测试,再显造车硬实力
如果用一句话来描述时下新能源市场,想必用“当下发展势头正盛,未来前景亦可期”再适合不过了。
用户8049510
2021/06/08
2460
构建汽车技术与装备交流平台,“中国汽研”开启汽车产业高质量发展新章
放在很多年前,提到“中国汽车”也许很多人会不屑一顾,但这也是情理之中,毕竟当时国内汽车市场都把持在欧美日等车企手中,说自主品牌举步维艰并不为过。直到2016年左右,中国汽车产业随着“新四化”的提出而迎来转机,不过也不是一开始就完成了飞跃,还是需要通过“引进”特斯拉这只“鲶鱼”刺激市场。如今中国汽车品牌也逐渐成为“鲶鱼”,像进入日本市场的比亚迪,就如同当年进入中国的特斯拉。
用户2908108
2022/12/17
3400
构建汽车技术与装备交流平台,“中国汽研”开启汽车产业高质量发展新章
狂飙年代:中国新能源汽车“野蛮生长”十年往事
小米SU7上市那晚,站在亦创国际会展中心舞台上的雷军,不知是否会想起2013年那个夏天。
小腾资讯君
2024/10/15
2030
2022年吉利集团主题研究报告
浙江吉利控股集团是中国的科技企业集团,始建于1986年,从生产电冰箱零件起步,发展到生产电冰箱、电冰柜、建筑装潢材料和摩托车。1997年进入汽车行业,经过快速发展,2009年轿车销量排名我国汽车生产企业第十位,2010年、2011年和2012年轿车销量排名均位居第八位(排名均以集团合并口径为准)。
资产信息网
2022/03/22
9180
2022年吉利集团主题研究报告
重庆:智能网联汽车驶入“快车道”,中国“底特律”走向复兴?
对于这场有关未来的竞争,我们可以将其一分为二,微观上是市场层面,各个企业公司之间的竞争;宏观上是产业层面,各个城市与地方政府之间的竞争。
用户2908108
2021/03/03
3950
重庆:智能网联汽车驶入“快车道”,中国“底特律”走向复兴?
2020年营收、净利双收,长城汽车做对了什么?
1月11日,百度官方宣布与吉利控股集团合作,组建一家智能电动汽车公司,正式以整车制造商的身份进军汽车行业,为汽车产业添砖加瓦。
刘旷
2021/02/02
5050
【专题】2022年新能源乘用车市场白皮书报告PDF合集分享(附原数据表)
新能源乘用车市场需求高涨,2022年新能源车销量达到了524.7万台,同比增长79.6%,市场份额也同比增长了8.2%。尽管受到局部疫情的影响,但下半年市场逐渐回暖,销量不断创新高(查看文末了解专题报告合集PDF版本免费获取方式)。
拓端
2023/12/20
3090
【专题】2022年新能源乘用车市场白皮书报告PDF合集分享(附原数据表)
重庆“山城模式”,能否成为智能网联汽车的“最优解”?
重庆市汽车商业协会此前发布的数据显示,重庆市场1月狭义乘用车销量达5.75万辆,其中新能源汽车销量占比21.3%,而纯电动汽车在新能源汽车的销量占比则达到了68%,且同比增长超228%,发展态势持续向好。
用户2908108
2022/04/02
5290
重庆“山城模式”,能否成为智能网联汽车的“最优解”?
新能源车企凶猛下沉,“新车商”是一条捷径吗?
根据11月份的销量数据,小鹏、理想、蔚来以及哪吒汽车当月的交付量均超过万台,零跑和威马的交付量达到了5000台的高位,极氪、创维、岚图等品牌也纷纷给出了月交付量上千台的成绩单。
Alter聊科技
2023/01/13
3220
新能源汽车的安全问题
近几年,国家对新能源车的政策推动不断,很多车企也看准时机,开始进军新能源市场,并推出插电混动、纯电动等不同车型供消费者选择。我们在选择新能源车时,要记住不被品牌的产品推广迷惑,而要从个人的需求出发,从续航、电池和配置等方面综合判断。
电子交流圈
2022/03/22
5010
汽车制造业下半年供应链市场导向分析,数字化转型战略趋势明显
在互联网快速发展的影响下,如何实现快速转型已经成为传统制造业目前重点关注的内容。作为我国经济发展的重要支柱,汽车企业战略转型更是受到关注。汽车制造业在互联网改革中,从设计、制造,再到销售都迎来全新挑战。
数商云网络科技
2021/10/26
4910
汽车制造业下半年供应链市场导向分析,数字化转型战略趋势明显
新能源正处于高速发展的阶段绝非一蹴而就
新能源汽车具有低能耗、轻污染等传统燃油汽车不可比拟的优点,可以改善能源紧缺与环境污染等问题,所以中国政府高度重视新能源汽车行业的研发,并作为中国战略新兴产业和“中国制造2025”的重点领域。近年来新能源汽车在政府大力持续的扶持引领下取得了突出的成绩。
电子交流圈
2022/03/22
2660
4月新能源车市「寒冬」,欧洲老牌车企们也躲不过
在严苛的减排目标前,欧洲车企们会躺平吗? 作者 | 来自镁客星球的家衡 受疫情等因素的影响,国内车企们在4月遭遇一场 “倒春寒”,各家销量一个比一个惨淡。那么在防疫政策相对宽松的海外,国外车企们的成绩又如何呢? 近日,欧洲多国陆续公布了4月新能源汽车销量情况。数据显示,欧洲主要国家均出现了销量环比下降的情况,其中新能源车渗透率最高的挪威,更是较去年同期出现了同比下降的情况。 一场汽车危机,已经到来? “寒冬”之下,供应链受挫 4月,国内新势力理想汽车仅仅交付4167辆,相比于3月破万的数据,环比降幅超过六
镁客网
2022/05/10
3470
4月新能源车市「寒冬」,欧洲老牌车企们也躲不过
推荐阅读
相关推荐
芯片短缺等问题让新能源车价格上涨
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验