Scala之集合(2)

news2024/11/26 0:47:52

 

目录

集合基本函数:

(1)获取集合长度

(2)获取集合大小

(3)循环遍历

(4)迭代器

(5)生成字符串

(6)是否包含

衍生集合:

(1)获取集合的头

(2)获取集合的尾

(3)集合最后一个数据

(4)集合初始数据

(5)反转

(6)取前(后)n 个元素

(7)去掉前(后)n 个元素

(8)并集(不去重)

(9)交集

(10)差集

(11)拉链

(12)滑窗

 集合的低级函数:

求和:

乘积:

最大值:

最小值:

排序:

简单排序:

从大到小:

从小到大:

排序二元组:

自定义排序:

sortWith排序:

集合计算高级函数:

过滤:

 map转化(映射):

转化1:

转化2:

转化3:

扁平化:

flatMap函数:

分组:

Reduce:

1.归约:

2.折叠(fold):

foldLeft():

 两个Map的归约(合并):

方法1:

方法二:


集合基本函数:

1)获取集合长度

    val length: Int = list.length

2)获取集合大小

    val size: Int = list.size

3)循环遍历

     list.foreach(println)

4)迭代器

 val iterator: Iterator[Int] = list.iterator
    while (iterator.hasNext)
      {
        println(iterator.next())
      }

5)生成字符串

mkString方法是toString底层的方法
toString是加上一些前缀与mkString方法的拼接
  val str: String = list.mkString("\t")
    println(str)

6)是否包含

 val bool: Boolean = list.contains(2)
    println(bool)

衍生集合:

调用一个方法  原集合保持不变  生成一个新的集合

1)获取集合的头

 val head: Int = list.head
    println(head)

2)获取集合的尾

(不是头的就是尾--->去掉头的剩余集合)
 val tail: List[Int] = list.tail
    println(tail)

3)集合最后一个数据

 
  val last: Int = list.last
    println(last)

4)集合初始数据

(不包含最后一个)
 val init: List[Int] = list.init
    println(init)

5)反转

 val reverse: List[Int] = list.reverse
    println(reverse)

6)取前(后)n 个元素

取前两个
   val ints: List[Int] = list.take(2)
取后两个
    val ints1: List[Int] = list.takeRight(2)

7)去掉前(后)n 个元素

去掉前俩
返回值为剩下的元素
    val ints2: List[Int] = list.drop(2)
去掉后俩
    val ints3: List[Int] = list.dropRight(2)

8)并集(不去重)

 val ints4: List[Int] = list.union(list1)

9)交集

    val ints5: List[Int] = list.intersect(list1)

10)差集

    val ints6: List[Int] = list.diff(list1)

11)拉链

---就是把两个集合进行拼接成二元组
当两个集合元素数量正好相等的时候  恰好组成元组
两恶搞集合元素数量不等的时候 会把多余的给舍弃
    val tuples: List[(Int, Int)] = list.zip(list1)

12)滑窗

场景:

给一个数组 (-200,50,-10,0,0,-80) 求任意相邻的三个数 成绩最大的是那三个

    val list2 = List(-200, 50, -100, 0, -80)
 val iterator: Iterator[List[Int]] = list2.sliding(3, 1)
    var result=0
    for (elem <- iterator) {
    if (result<elem.product) {
      result=elem.product
    }
    }
参数  窗口大小      步长(一次几个格子)   如果在最后元素少于窗口大小 则依然输出剩下的 
product   product()方法属于类Abstract Iterator的具体值成员。它用于乘以指定集合的所有元素。

 集合的低级函数:

求和:

val sum: Int = ints.sum

乘积:

    val product: Int = ints.product

最大值:

    val max: Int = ints.max

最小值:

    val min: Int = ints.min

上述函数都没有()但是他是有参数的 他是一种隐式参数

排序:

简单排序:

排序计算机是采用的快排,默认是从小到大排序,如果需要从大到小需要重写他的参数

从大到小:

    val sorted: List[Int] = ints.sorted

从小到大:

    val ints1: List[Int] = ints.sorted(Ordering.Int.reverse)

排序结果的输出可以迭代器也可以for循环

 val iterator: Iterator[Int] = sorted.iterator
    while(iterator.hasNext)
      {
        print(iterator.next()+"  ")
      }

排序二元组:

    val tuples = List(("hello", 10), ("world", 20), ("tuple", 32), ("spark", 58))

 默认按照第一个元素进行排序

    val tuples1: List[(String, Int)] = tuples.sorted(Ordering[(String, Int)])

 反转排序:它是按照字母的倒叙进行排序

    val reverse: List[(String, Int)] = tuples.sorted(Ordering[(String, Int)]).reverse

两种排序的运行结果对比:

自定义排序:

按照单词出现的次数排序:

这样是需要自定义的 调用sortBy()函数(By---什么方式)

设置返回类型就是按照什么排序(匿名函数)

    val tuples2: List[(String, Int)] = tuples.sortBy((tuples: (String, Int)) => tuples._2)

按照单词出现的次数反转排序:

通过sortBy()源码可知他是采用了柯里化写法(闭包---把上层变量定义成常量传给下一层)

    val reverse1: List[(String, Int)] = tuples.sortBy((tuples: (String, Int)) => tuples._2)(Ordering[Int]).reverse

上述代码在第一次传入参数返回的是以Int类型的集合   在对他进行封装成常量传递给下层  所以 在柯里化的第二个()的时候在设置类型的时候要设置Int类型

sortWith排序:

sortWith参数形式:

 这个就是类似于冒泡排序左边于靠近的右边的进行比较,当不满足某条件的时候进行调换

    val tuples3: List[(String, Int)] = tuples.sortWith((lift: (String, Int), right: (String, Int)) => lift._2 > right._2)

集合计算高级函数:

下边所写高阶函数都有一个默认的foreach()逻辑,在进行下边操作的时候都会一个一个的传入(遍历)

过滤:

遍历一个集合并从中获取满足指定条件的元素组成一个新的集合
 参数为让你填一个函数 int--->BOOL
将集合中元素作为填写函数的传入参数
得到返回结果如果为true 保留 为false 删除 
    val ints1: List[Int] = ints.filter(i=> i %2  == 0)

 map转化(映射):

map转化是使用集合的map方法进行结构转化

map方法的参数形式:

 

转化1:

    val ints2: List[Int] = ints.map(i => i * 2)

转化2:

    val tuples: List[(String, Int)] = ints.map((i:Int) => ("我是", i))

转化3:

在Hadoop的hdfs中我们存储的是半结构化数据(一条条的数据字符串)

    val list = List("zhangsan,18,男,180", "tangxiaocong,19,男,185")
      list.map((line:String)=>{
        val strings: Array[String] = line.split(",")
        //构造元组
        (strings(0),strings(1),strings(2),strings(3))
      })

扁平化:

扁平化的使用场景为List集合嵌套List集合,对于这种情况需要使用炸裂

    val list1 = List(List(1, 2, 3, 4), List(4, 5, 6, 7), List(7, 8, 9, 10))
    val flatten: List[Int] = list1.flatten

执行结果:(不去重)

 元素必须是可拆分的集合才能调用扁平化

特例:

如果在List中是String则可以使用flatten函数(String是char的集合)

上述情况会把String转换成char的形式

所以在扁平化的时候需要将集合中的字符串转化成List形式(map转化)

   val list2 = List("hello world", "hello scala", "hello spark")
    val list3: List[List[String]] = list2.map((line: String) => {
      val strings: Array[String] = line.split(",")
      strings.toList
    }
    )

让后在进行扁平化(直接调用flatten)

val flatten1: List[String] = list3.flatten

 在框架中使用的是flatMap(实际是map+flatten)

flatMap函数:

传入的参数还是map转化的逻辑,让后默认调用flatten函数

   val strings1: List[String] = list2.flatMap((line: String) => {
 line.split(",")
    }
    )

flattenMap函数需要的参数是集合的形式,是不需要转化成List集合的

分组:

分组之后多组数据转换成了一行数据 生成数据有相同的key   value值变成了一个List集合

   val tuples1 = List(("A", 10), ("B", 20), ("C", 11), ("D", 15),("A", 16), ("B", 26), ("C", 41), ("D", 35))
    val map: Map[String, List[(String, Int)]] = tuples1.groupBy(tuple => tuple._1)

分组条件不止可以为元组的某个值,也可以是自己特定的(通过匿名函数设定)

  val ints3 = List(1, 2, 3, 5, 4, 6, 7, 8, 9)
    val map1: Map[Int, List[Int]] = ints3.groupBy((i: Int) => i % 2)

 返回值的结果是什么就按照什么进行排序

Reduce:

1.归约:

参数表示:输入输出的数据类型是一致的

第一个A1:表示每次调用的结果值

第二个A1:表示当前元素值

第三个A3:本次调用的返回结果, 作为下次的结果值

reduce将第一个初始值作为结果值进行传递  让后直接进行下次reduce(跳过第一个元素从第二个元素开始运行逻辑)

    val ints = List(1, 5, 6, 7, 8)
    val i1: Int = ints.reduce((res: Int, i: Int) => res +i*2)

 正确结果该是54 输出结果为53  因为运算逻辑为(1+5*2+6*2+7*2+8*2=53)

而我们正确的逻辑应该为1*2+5*2+6*2+7*2+8*2=54

2.折叠(fold):

归约的一种方法

这个函数是采用的柯里化写法第一个()传入初始值(也是结果值),第二个()传入运算逻辑

fold方法就很好的设置了初始值,解决了Reduce方法的缺点

    val i2: Int = ints.fold(0)((res: Int, i: Int) => res + i * 2)

运行结果: 

 

foldLeft():

初始值可以为不同类型(常用于Map,tuple)

  val tuple: (String, Int) = ints.foldLeft(("sum : elem*2", 0))((res: (String, Int), elem: Int) => {
      //创建一个新的二元组
      (res._1, res._2 + elem * 2)
    })

 两个Map的归约(合并):

两个Map集合  一个作为结果存储 一个作为集合遍历

方法1:

val map = mutable.Map(("String", 14), ("Scala", 35))
    val map1 = Map(("String", 14), ("Scala", 35), ("Spark", 33))
    for (elem <- map1) {
      val key: String = elem._1
      val value: Int = elem._2
      if (map.contains(key))
        {
           map.update(key, value + map.getOrElse(key,0))
        }
      else
        {
         map.put(key,value)
        }
    }

上述方法的两个Map(一个是不可变 一个是可变)---不可以重复执行(不稳定,会不断的累加)

方法二:

下边两个Map都是不可变的:

不可变集合  做出改变后要重新返回一个对象

   val map2 = Map(("String", 14), ("Scala", 35))
    val map3 = Map(("String", 14), ("Scala", 35), ("Spark", 33))
    val map4: Map[String, Int] = map2.foldLeft(map3)((mape, elem) => {
      mape.updated(elem._1, mape.getOrElse(elem._1, 0) + elem._2)
    })
    println(map4)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

itop-3568 开发板系统编程学习笔记(20)看门狗应用编程

【北京迅为】嵌入式学习之Linux系统编程篇 https://www.bilibili.com/video/BV1zV411e7Cy/ 个人学习笔记 文章目录 看门狗简介看门狗编程命令&#xff08;方法&#xff09;开启和关闭看门狗设置超时时间获取超时时间喂狗 看门狗底层简析看门狗编程实验 看门狗简介 看门狗&#…

MiniGPT-4开源了:看图聊天、教学、创作、搭网站

深度学习系列文章 文章目录 深度学习系列文章前言MiniGPT4效果展示 前言 一个月前&#xff0c;OpenAI 总裁 Greg Brockman 向世人展示了 GPT-4 令人惊讶的多模态能力&#xff0c;如从手写文本直接生成网站和识别图像中的幽默元素等。 尽管目前 OpenAI 暂未对 GPT-4 用户开放这…

农业灌溉以电折水测控终端-开启用水计量新模式

产品概述 农业灌溉以电折水测控终端&#xff08;MGTR-W&#xff09;是一款拥有“最强大脑”的农业水资源计量管理终端&#xff0c;内置以电折水逻辑运算&#xff0c;主要研究耗电量与取水量之间的关系&#xff0c;分析水电折算系数&#xff0c;进而通过计算耗电量与水电折算系数…

如何在个人web项目中使用Servlet监听器?

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 服务器软件&#xff1a;apache-tomcat-8.5.27 目录 一. Servlet监听器是什么&#xff1f;二. Servlet监听器有哪些作用?2.1 监听域对象的创建和销毁2.1.1 ServletContextListener接口…

zabbix自定义监控项脚本

以下脚本具体如何使用可参考以下文章 配置zabbix自定义监控项_Apex Predator的博客-CSDN博客 1.检测url是否存活 vi /opt/zabbix_jb/check_url_status.sh #!/bin/bash acurl -s -o /dev/null -w "%{http_code}" "$1" bcurl -s -o /dev/null -w "%…

heic的照片怎么转化jpg格式,3个工具分享

heic的照片怎么转化jpg格式&#xff1f;当我想要把照片进行人物抠像的话那我们得需要使用专业图片软件PS。因为人物抠像是一种常见的图像处理技术&#xff0c;它在我们职场中有广泛的需求&#xff0c;它可以将人物从照片中提取出来放置到其他地方&#xff0c;使得照片更具专业性…

如何在 Cockpit 中管理虚拟机

Cockpit 是一个很将整个服务器置于一个集中的控制面板中&#xff0c;并对它们进行相当程度的控制。还可以在Cockpit中创建和管理虚拟机。 环境 Centos8 安装Cockpit 要使用 Cockpit 创建和管理虚拟机&#xff0c;必须在运行 Cockpit 的计算机上安装 cockpit-machines 模块&…

【传统方式部署Ruoyi微服务】

IP机器与部署组件 部署思路顺序&#xff1a; 1 安装mysql wget https://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm rpm --import https://repo.mysql.com/RPM-GPG-K…

排序 - 快速排序(Quick Sort)

文章目录 快速排序介绍快速排序实现快速排序时间复杂度和稳定性快速排序稳定性快速排序时间复杂度 代码实现核心&总结 快速排序介绍 它的基本思想是: 选择一个基准数&#xff0c;通过一趟排序将要排序的数据分割成独立的两部分&#xff1b;其中一部分的所有数据都比另外一…

使用QToolButton和QStackedWidget的侧边栏(SideBar)的实现与实现原理解析

使用QToolButton和QStackedWidget的侧边栏&#xff08;SideBar&#xff09;的实现与实现原理解析 原文链接&#xff1a;https://blog.csdn.net/qq153471503/article/details/128528072 Demo下载&#xff1a;https://gitee.com/jhuangBTT/QtSideBar 1、简介 侧边栏是一个很常用…

ModStartBlog v7.2.0 暗黑模式,超级搜索,富文本升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装会…

Spring Security Ldap 登录认证流程的源码梳理

一、通过请求Controller开始登录认证 通过authenticationManager调用authenticate()方法开始登录认证&#xff0c;因为authenticationManager是通过Bean注入&#xff0c;因为SecurityLdapConfig是继承的WebSecurityConfigurerAdapter类&#xff0c;所以authenticationManager的…

【Unity+MySQL】实现注册登录系统(封装版)

目录 1 MySQL封装2 用户注册、登录方法封装3 Unity交互 接着 上篇文章的注册登录系统&#xff0c;这篇文章将MySQL相关操作封装&#xff0c;在Unity交互脚本中直接调用封装的方法。 1 MySQL封装 编写一个DBConnector脚本&#xff0c;封装MySQL中常用的操作&#xff0c;如连接…

【已解决】SpringBoot 工程 war包服务部署与调用测试

1.开发环境&#xff1a;IDEA&#xff0c;JDK1.8 2.服务打包类型&#xff1a; war包 3.war包部署环境&#xff1a;Linux系统&#xff0c;tomcat服务器&#xff0c;端口号&#xff1a;8081 4.war包部署位置&#xff1a;tomcat-8081/webapps/temp.war 5.服务名为&#xff1a;t…

Java版本企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…

Postman轻松签名,让SHA256withRSA保驾护航!

postman接口签名教程&#xff1a;https://www.bilibili.com/video/BV1r14y1A7MQ/? 目录&#xff1a;导读 前言 获取pmlib 引入依赖bundle.js&#xff0c;有以下两种方式&#xff1a; 使用Pre-request Script对请求进行加签(具体加签字段请看自己项目) 结语 前言 在接口测…

荔枝派Zero(全志V3S)开启alsa,测试codec

文章目录 前言一、ALSA 简介二、ALSA 框架三、buildroot 配置四、烧录到 SD 卡五、测试1、查看 CODEC 设备2、alsa-utils 使用①、查看设备②、调节音量③、查看控制器④、录音测试⑤、播放测试 前言 默认 dts 中使能了 codec 需要使用的话&#xff0c;在 buildroot 中勾选 a…

2023年五月份图形化四级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

开放式耳机有什么好处,盘点几款性能不错的开放式耳机

随着人们对生活质量要求的提高&#xff0c;大家在运动的时候都喜欢戴上耳机&#xff0c;享受运动的乐趣。但是传统耳机戴久了之后就会出现耳朵酸痛的情况&#xff0c;这是因为传统耳机佩戴方式是通过空气振动来传递声音&#xff0c;而人在运动时就会伴随着大量的汗水&#xff0…

基于ResNet-attention的负荷预测

一、attention机制 注意力模型最近几年在深度学习各个领域被广泛使用&#xff0c;无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中&#xff0c;都很容易遇到注意力模型的身影。从注意力模型的命名方式看&#xff0c;很明显其借鉴了人类的注意力机制。我们来看…