scala学习

集合常用函数

集合的基本属性与常用操作

  • 长度、大小、循环遍历、迭代器、生成字符串、是否有包含等

    object TestSetFunction {def main(args: Array[String]): Unit = {val list = List(1,2,3,4,5,6,7,8,9)// 长度println(list.length)// 集合大小println(list.size)//遍历list.foreach(println)// 迭代器for (item <- list){println(item)}// 生成字符串println(list.mkString(","))// 判断是否包含println(list.contains(5))}
    }
    /**输出结果为:
    9
    9
    1
    2
    3
    4
    5
    6
    7
    8
    9
    1
    2
    3
    4
    5
    6
    7
    8
    9
    1,2,3,4,5,6,7,8,9
    true
    **/
    

衍生集合的操作

  • 这些操作基于原始集合生成新集合

    // 设置集合val numList=List(1,2,3,4)val abList = List(3,4,5,6)
    
    • 获取集合头/尾:

          // 获取集合头println(numList.head)// 获取集合尾(集合尾指出了集合头以外的全部元素println(numList.tail)// 集合的最后一个数据println(numList.last)// 集合的初始数据(除了最后一个数据println(numList.init)
      /**
      1
      List(2, 3, 4)
      4
      List(1, 2, 3)
      **/
      
    • 反转集合

          // 反转println(numList.reverse)
      /**
      List(4, 3, 2, 1)
      **/
      
    • 取(去)前(后)n个元素

          // 取前后n个元素println(numList.take(2))println(numList.takeRight(2))// 去掉前后n个元素println(numList.drop(2))println(numList.dropRight(2))
      /**
      List(1, 2)
      List(3, 4)
      List(3, 4)
      List(1, 2)
      **/
      
    • 交、并、差集

          // 并集println(numList.union(abList))// 交集println(numList.intersect(abList))// 差集println(numList.diff(abList))
      /**
      List(1, 2, 3, 4, 3, 4, 5, 6)
      List(3, 4)
      List(1, 2)
      **/
      
    • 拉链(PS:当两个集合的元素个数不相等的时候,会将同等数量的熟进行拉连,多余的数据省略不用

          // 拉链println(numList.zip(abList))
      /**
      List((1,3), (2,4), (3,5), (4,6))
      **/
      
    • 滑窗

          // 滑窗(第一个参数尾滑窗尺寸,第二个参数为步幅)val list = List(1,2,3,4,5,6,7,8,9)list.sliding(3,2).foreach(println)
      /**
      List(1, 2, 3)
      List(3, 4, 5)
      List(5, 6, 7)
      List(7, 8, 9)
      **/
      

集合计算的初级函数

  • 一些对集合的计算的简单函数:

    object TestSetFunction2 {def main(args: Array[String]): Unit = {val list = List(1,2,3,4,5,-12)//求和println(list.sum)//求乘积println(list.product)//求最大值println(list.max)//最小值println(list.min)//排序// 按元素大小排序println(list.sortBy(x => x))// 按元素大小绝对值排序println(list.sortBy(x => x.abs))// 按元素大小升序降序println(list.sortWith((x,y) => x<y))// 按元素大小降序排列println(list.sortWith((x,y)=>x>y))}
    }
    /**
    3
    -1440
    5
    -12
    List(-12, 1, 2, 3, 4, 5)
    List(1, 2, 3, 4, 5, -12)
    List(-12, 1, 2, 3, 4, 5)
    List(5, 4, 3, 2, 1, -12)
    **/
    

集合计算高级函数

  • 诸如过滤、映射、扁平化等一系列操作

    object TestAdvancedFunction {def main(args: Array[String]): Unit = {val list = List(1,2,3,4,5,6,7,8,9)val doubleList = List(List(1,2,3,4),List(5,6,7,8),List(9,10))val wordList = List("a b c","d e f g","12 13 14")// 过滤println(list.filter(x => x%2==0))//映射println(list.map(x=>x*10))// 扁平化println(doubleList.flatten)//扁平化加映射(PS:这种方法相当于先进行map操作然后进行flatten操作)println(wordList.flatMap(x=>x.split(" ")))}
    }
    /**
    List(2, 4, 6, 8)
    List(10, 20, 30, 40, 50, 60, 70, 80, 90)
    List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    List(a, b, c, d, e, f, g, 12, 13, 14)
    **/
    
  • reduce方法

    reduce简化(规约):通过指定的逻辑将集合中的数据进行聚合,从而减少数据最终获得结果

    • 从源码的角度来说,reduce其实就是调用了reduceLeft方法。
    object TestReduce {def main(args: Array[String]): Unit = {val list = List("1","2","3","4")val i = list.reduce((x,y)=>x+y)println(i)//reduceLeft和reduceRightprintln(list.reduceLeft((x,y)=>x+y))println(list.reduceRight((x,y)=>x+y))}
    }
    /**
    1234
    1234
    1234
    **/
    
  • flod方法

    • flod就是一个带有初始值的reduce方法,他使用了函数柯里化,有两个参数列表

      • 第一个参数即为初始值
      • 第二个参数就是处理流程(处理方式)
    object TestFold {def main(args: Array[String]): Unit = {val list=List("a","b","c","d")println(list.fold("start")((x,y)=>x+y))// 与reduce类似的,flod本质上调用的flodLeft方法println(list.foldLeft("start")((x,y)=>x+y))}
    }
    /**
    startabcd
    startabcd
    **/
    
  • 通过scala集合实现简单的wordCount

    • 思路,先用flatmap方法对每个字符串进行切分然后展开,再对每个相同单词进行归并
    • 然后对单词计数即可。
    object TestWordCount {def main(args: Array[String]): Unit = {val list = List("Just test a word count","word count","just a test","test a word count")// 首先将每个句子分隔成单词val l1=list.flatMap(x=>x.split(" "))// 相同单词合并val l2 = l1.groupBy(word => word)// 计数val l3 = l2.map(tuple => (tuple._1, tuple._2.size))// 对计数结果做排序val result = l3.toList.sortWith((left, right)=>left._2 > right._2)// 输出结果println(result)}
    }
    /**
    List((test,3), (count,3), (a,3), (word,3), (just,1), (Just,1))
    **/
    
  • 通过scala实现相对复杂的wordcount案例:

    • list中为一个一个的元组,元组中有两个元素,一个是一句包含一个以上单词的句子,第二个元素为一个整数,表示该句子出现的次数。
    • 实现思路,通过flatmap将每个元组中的句子单独裁开,统计出现次数后进行group操作,然后再进行reduce操作求和,得到结果。
    object TestWoedCount2 {def main(args: Array[String]): Unit = {val tuples = List(("Remilia Scarlet is best",3),("Remilia Scarlet and Frandre Scarlet are the sisters",2),("They are not twins",4))// 第一步,对每一个元组中的句子进行split并与出现次数相组合、获得一个词,次数的元组列表val words = tuples.flatMap{t => {val wordlist = t._1.split(" ")wordlist.map(word => (word,t._2))}}//按每个元组的词进行排序:words.sortBy(x => x._1)//相同单词进行归并val groups = words.groupBy(x => x._1)// 每个单词进行求和val resultMap = groups.map{x => {val word = x._1val value = x._2.reduce((a,b) => (a._1,a._2+b._2))(word,value)}}// 解除map嵌套并排序val result = resultMap.map(x=>x._2).toList.sortBy(-_._2)println(result)}
    }
    /**
    输出结果:
    List((Scarlet,7), (are,6), (Remilia,5), (They,4), (twins,4), (not,4), (is,3), (best,3), (Frandre,2), (sisters,2), (and,2), (the,2))
    **/
    
    • 以上过程可以免除过多变量的问题,直接写成:
    object TestWoedCount2 {def main(args: Array[String]): Unit = {val tuples = List(("Remilia Scarlet is best",3),("Remilia Scarlet and Frandre Scarlet are the sisters",2),("They are not twins",4))val result = tuples.flatMap{t => {val wordlist = t._1.split(" ")wordlist.map(word => (word,t._2))}}.sortBy(x => x._1).groupBy(x => x._1).map{x => {val word = x._1val value = x._2.reduce((a,b) => (a._1,a._2+b._2))(word,value)}}.map(x=>x._2).toList.sortBy(-_._2)println(result)}
    }
    /**
    输出结果同上
    **/
    

并行集合

  • scala为了充分利用多核cpu,提供了并行集合,用于多喝环境的并行计算
  • 语法:
    • 普通集合:(0 to 20).map{case _ => Thread.currentThread.getName}
    • 并行集合:(0 to 20).par.map{case _ => Thread.currentThread.getName}
    • 结果:
      • Vector(main, main, main, main, main, main, main, main, main, main, main, main, main, main, main, main, main, main, main, main, main)
      • ParVector(ForkJoinPool-1-worker-13, ForkJoinPool-1-worker-13, ForkJoinPool-1-worker-3, ForkJoinPool-1-worker-3, ForkJoinPool-1-worker-3, ForkJoinPool-1-worker-7, ForkJoinPool-1-worker-7, ForkJoinPool-1-worker-5, ForkJoinPool-1-worker-5, ForkJoinPool-1-worker-5, ForkJoinPool-1-worker-11, ForkJoinPool-1-worker-11, ForkJoinPool-1-worker-1, ForkJoinPool-1-worker-1, ForkJoinPool-1-worker-1, ForkJoinPool-1-worker-9, ForkJoinPool-1-worker-9, ForkJoinPool-1-worker-9, ForkJoinPool-1-worker-15, ForkJoinPool-1-worker-15, ForkJoinPool-1-worker-15)

scala学习之scala中一些集合的常用函数相关推荐

  1. matlab数米粒实验报告,文化学习上机实验中遇到的一些Matlab函数.ppt

    文化学习上机实验中遇到的一些Matlab函数.ppt 上机实验中遇到的一些Matlab函数,(1)* .* . (2)abc linspace(a,b,c) (3)log log10 (4)exp ( ...

  2. 大数据HiveSQL学习笔记三-查询基础语法以及常用函数

    大数据HiveSQL学习笔记三-查询基础语法以及常用函数 一.基础语法 1.SELECT -列名- FROM -表名- WHERE -筛选条件- 如:需要根据城市,性别找出匹配的10个用户 user_ ...

  3. php 与时间有关的函数,php中与时间相关的常用函数有哪些

    php中与时间相关的常用函数有:date_default_timezone_set().date_create().date_diff().date_timestamp_get().strtotime ...

  4. Python中numpy.linalg库常用函数

    Python中numpy.linalg库常用函数 numpy.linalg Python中numpy.linalg库常用函数 简单记录所遇到的numpy库内置函数 矩阵与向量积 ①np.linalg. ...

  5. Scala学习(一)--Scala基础学习

    Scala基础学习 摘要: 在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作.在这个过程中,我们将介绍一系列重要的Scala概念和惯用法.同时你还将学 ...

  6. Scala学习--《Scala编程》

    2019独角兽企业重金招聘Python工程师标准>>> Scala学习手册--可伸缩的语言(随着使用者的需求而成长)  第一章:基本概念 Scala=FP+OO.静态语言 兼容性.简 ...

  7. mysql学习总结-初识+数据管理+增删改查+常用函数+事务理解+数据库设计+JDBC引入

    1.初识MySQL 1.1数据库的定义 数据库(DataBase,简称DB),是一个按数据结构来存储和管理数据的计算机软件系统.每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制 ...

  8. [Dart] Flutter开发中的几个常用函数

    几个Flutter开发中的常用函数 /** 返回当前时间戳 */static int currentTimeMillis() {return new DateTime.now().millisecon ...

  9. Python中处理字符串的常用函数汇总【文末送书】

    正式的Python专栏第23篇,同学站住,别错过这个从0开始的文章! 今天我们说了字符串的基础,格式化,这次我们讲解字符串的常用函数,不要错过! (文本送书,评论区抽取一位送书) 前两篇都在本文同个专 ...

最新文章

  1. LeetCode每日训练2—有序矩阵中第K小的元素(7.2)
  2. http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1895 二分
  3. JAVA开发需求分析套路_毕设做什么好?感觉都是套路了
  4. ansible 第四次作业
  5. tcp 三次握手连接
  6. 【dede】列表页调用二三级导航栏
  7. 如何批量给 Word、Excel、PDF、PPT 文档设置文件打开密码和删除密码
  8. 关于新手做ASO的一些方法和技巧
  9. 终于不用早起抢菜了?GitHub 买菜插件出世开源了!
  10. Windows11/10 使用RDP远程桌面时提示 您的凭据不工作/登录没有成功可能的一种原因
  11. Java Swing图书管理系统桌面软件附源码
  12. fft理解-cooley turkey
  13. 从梯度下降到 Adam!一文看懂各种神经网络优化算法
  14. 基于TCP/UDP的P2P网络通信协议研究与实现
  15. jQuery_03_操作HTML和CSS
  16. 微软云服务器怎么注销,Microsoft 账户删除及注销
  17. 模具设计如何能够快速入门
  18. 良心推荐的一些Chrome插件
  19. c语言课设报告 中南,中南大学c语言课程实践报告
  20. 马斯克怒了:我要起诉微软!

热门文章

  1. 【Linux】-关于Linux的指令(上)
  2. Matlab方根运算
  3. pyspark.sql.functions.lit(col)
  4. *每日一题(三零)var a = 10 var foo={ a:20, bar:function(){ var a=30 return this.a
  5. C++重载双目运算符
  6. C语言青蛙过河游戏超详细教程【附源码】
  7. Fyne 折腾手记:开发一个简易桌面应用
  8. WordPress修改默认邮箱、用户名(图解)
  9. Ernie-SimCSE对比学习在内容反作弊上应用
  10. 记一个rabbitmq启动失败解决方案