Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
scala练习
    //val lst2=for(e <- lst0 if e%2==0) yield e*1
Dlimeng
2023/06/29
1220
Scala入门篇 顶
scala> val a = println("ddd") ddd a: Unit = ()
算法之名
2019/08/21
5000
Scala入门篇
                                                                            顶
scala(十三) 集合
sorted sortBy(func: 集合元素类型 => B) sortBy里面的函数也是针对集合每个元素进行操作 sortBy后续是根据函数返回值进行排序
用户1483438
2022/04/18
5340
Scala综合练习_基于以下List集合实现词频统计
基于以下List集合实现词频统计 val list = List("hadoop spark hive ",""," hue spark hadoop hadoop","hue hive hive hive","spark hadoop hadoop") 实现词频统计,并按照单词个数降序排序,实现结果如下 hadoop-5 hive-4 spark-3 hue-2 val list = List("hadoop spark hive ",""," hue spark hadoop hadoop","
Maynor
2021/12/07
2170
Scala学习一
1.集合操作练习 //创建一个List val lst0 = List(1,7,9,8,0,3,5,4,6,2) //将lst0中每个元素乘以10后生成一个新的集合 lst0.map(x => x*10 ) OR lst0.map(_*10 ) //将lst0中的偶数取出来生成一个新的集合 lst0.filter(x => x%2==0) lst0.filter(x => x%2==0).map(_*5) //将lst0排序后生成一个新的集合 lst0.sorted lst0.sortBy(x => x
sparkle123
2018/04/28
1.2K0
scala(十五) List
不可变List 不可变List的创建: 通过apply方法创建: List[元素类型](初始元素,...) val list=List[Int](1,2,3,4,5,6,7,8,9,10) 通过 :: 方法创建: 初始元素 :: 初始元素 :: ... :: Nil/不可变List val list=1::2::3::4::5::6::7::8::9::10::Nil Nil相当于一个空的List,Nil与不可变List的关系类似Null与String的关系,使用Nil给不可变List赋予初始值的时候
用户1483438
2022/04/19
8830
2021年大数据常用语言Scala(二十五):函数式编程 排序
有一个列表,分别包含几下文本行:"01 hadoop", "02 flume", "03 hive", "04 spark"
Lansonli
2021/10/11
3350
Scala系列 (二)Scala数组----超详细常用方法及其用法
写在前面: 我是「nicedays」,一枚喜爱做特效,听音乐,分享技术的大数据开发猿。这名字是来自world order乐队的一首HAVE A NICE DAY。如今,走到现在很多坎坷和不顺,如今终于明白nice day是需要自己赋予的。 白驹过隙,时光荏苒,珍惜当下~~ 写博客一方面是对自己学习的一点点总结及记录,另一方面则是希望能够帮助更多对大数据感兴趣的朋友。如果你也对 大数据与机器学习感兴趣,可以关注我的动态 https://blog.csdn.net/qq_35050438,让我们一起挖掘数据与人工智能的价值~
用户7886150
2020/12/12
1.9K0
Scala 高阶(七):集合内容汇总(上篇)
Scala中的集合与Java中的集合相类似,但是又有很多的改变,接下来我们开启Scala集合篇的学习历程吧!
百思不得小赵
2022/12/01
1.1K0
Scala 高阶(七):集合内容汇总(上篇)
酷炫的一行代码 - Scala就是这么任性!
1. 过滤出序列中所有偶数 filter方法会将序列中各个元素依次替换到下划线"_"所处位置,如果返回true,则保留该元素。 (1 to 9).filter( _ % 2 == 0 ) 输出:2, 4, 6, 8  2. 对序列中所有元素求和 reduceLeft是一个通用的聚集计算方法,你可以把"+"换成其它的运算。其实对于求和有更简单的方法,请参考第6条。 (1 to 9).reduceLeft(_ + _) 输出:45 3. 统计单词出现次数 groupBy方法可以将序列转换成Map,适合用在需要按
joymufeng
2018/05/17
8260
Scala集合练习题
//创建一个List val list0 = List(1,7,9,8,0,3,5,4,6,2) //将list0中每个元素乘以10后生成一个新的集合 //将list0中的偶数取出来生成一个新的集合 //将list0排序后生成一个新的集合 //反转顺序 //将list0中的元素4个一组,类型为Iterator[List[Int]] //将Iterator转换成List //将多个list压扁成一个List val
Albert陈凯
2018/04/04
1.7K0
scala快速入门系列【函数式编程】
本篇作为scala快速入门系列的第十六篇博客,为大家带来的是关于函数式编程的相关内容。
大数据梦想家
2021/01/26
1.3K0
scala快速入门系列【函数式编程】
scala List immutable.Map[String,Any]]的排序问题
帮同事处理List[scala.collection.immutable.Map[String,Any]]的排序问题
全栈程序员站长
2021/05/19
7630
Scala 学习笔记之数组
对于那种长度按需要变化的数组,Java有 ArrayList.Scala中等效数据结构为 ArrayBuffer.
smartsi
2019/08/07
4530
Scala随笔
Scala混入特质 package com.jmy import java.util import scala.io.StdIn object ObjectDemo01 { def main(args: Array[String]): Unit = { // 单例模式懒汉式 var demo: ScalaDemo = ScalaDemo.getIntance() var demo1: ScalaDemo = ScalaDemo.getIntance() println
姜同学
2022/10/27
2660
【Scala篇】--Scala中集合数组,list,set,map,元祖
备注:数组方法 1     def apply( x: T, xs: T* ): Array[T] 创建指定对象 T 的数组, T 的值可以是 Unit, Double, Float, Long, Int, Char, Short, Byte, Boolean。 2     def concat[T]( xss: Array[T]* ): Array[T] 合并数组 3     def copy( src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int ): Unit 复制一个数组到另一个数组上。相等于 Java's System.arraycopy(src, srcPos, dest, destPos, length)。 4     def empty[T]: Array[T] 返回长度为 0 的数组 5     def iterate[T]( start: T, len: Int )( f: (T) => T ): Array[T] 返回指定长度数组,每个数组元素为指定函数的返回值。 以上实例数组初始值为 0,长度为 3,计算函数为a=>a+1: scala> Array.iterate(0,3)(a=>a+1) res1: Array[Int] = Array(0, 1, 2) 6     def fill[T]( n: Int )(elem: => T): Array[T] 返回数组,长度为第一个参数指定,同时每个元素使用第二个参数进行填充。 7     def fill[T]( n1: Int, n2: Int )( elem: => T ): Array[Array[T]] 返回二数组,长度为第一个参数指定,同时每个元素使用第二个参数进行填充。 8     def ofDim[T]( n1: Int ): Array[T] 创建指定长度的数组 9     def ofDim[T]( n1: Int, n2: Int ): Array[Array[T]] 创建二维数组 10     def ofDim[T]( n1: Int, n2: Int, n3: Int ): Array[Array[Array[T]]] 创建三维数组 11     def range( start: Int, end: Int, step: Int ): Array[Int] 创建指定区间内的数组,step 为每个元素间的步长 12     def range( start: Int, end: Int ): Array[Int] 创建指定区间内的数组 13     def tabulate[T]( n: Int )(f: (Int)=> T): Array[T] 返回指定长度数组,每个数组元素为指定函数的返回值,默认从 0 开始。 以上实例返回 3 个元素: scala> Array.tabulate(3)(a => a + 5) res0: Array[Int] = Array(5, 6, 7) 14     def tabulate[T]( n1: Int, n2: Int )( f: (Int, Int ) => T): Array[Array[T]] 返回指定长度的二维数组,每个数组元素为指定函数的返回值,默认从 0 开始。
LhWorld哥陪你聊算法
2018/09/13
2.8K0
Scala 【 11 Scala的集合体系结构 】
​ 其中 Iterable 是所有集合 trait 的根 trait。这个结构与Java的集合体系非常相似。
Lokinli
2023/03/09
4710
scala(十四) 数组
除了上面的写法,arr1 ++ arr2 也可以写成 arr1.++(arr2),只是上面的方式更简洁。
用户1483438
2022/04/19
9410
Scala | 教程 | 学习手册 --- 常用集合
所有集合的根是Iterator,它提供了一组公共方法,可以用来迭代处理和管理集合数据。
曲奇
2021/12/14
6670
Scala | 教程 | 学习手册 --- 常用集合
Scala的map实现key和value排序及各种排序比较等知识讨论
问题导读 1.map能否直接排序? 2.如何转换,才能排序? 3.排序结果可以存储在哪两个集合中? 4._*如何使用? 5.排序函数中,哪个可以进行升序和降序排列? 6.他们的排序性能如何?
用户1410343
2018/03/26
3.8K0
Scala的map实现key和value排序及各种排序比较等知识讨论
相关推荐
scala练习
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档