Scala之集合(2)
目录
集合基本函数:
(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.iteratorwhile (iterator.hasNext){println(iterator.next())}
(5)生成字符串
val str: String = list.mkString("\t")println(str)
(6)是否包含
val bool: Boolean = list.contains(2)println(bool)
衍生集合:
调用一个方法 原集合保持不变 生成一个新的集合
(1)获取集合的头
val head: Int = list.headprintln(head)
(2)获取集合的尾
val tail: List[Int] = list.tailprintln(tail)
(3)集合最后一个数据
val last: Int = list.lastprintln(last)
(4)集合初始数据
val init: List[Int] = list.initprintln(init)
(5)反转
val reverse: List[Int] = list.reverseprintln(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=0for (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.iteratorwhile(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()逻辑,在进行下边操作的时候都会一个一个的传入(遍历)
过滤:
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._1val value: Int = elem._2if (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)
相关文章:
Scala之集合(2)
目录 集合基本函数: (1)获取集合长度 (2)获取集合大小 (3)循环遍历 (4)迭代器 (5)生成字符串 (6)是否包含 衍生集合…...
【图像分割】视觉大模型SEEM(Segment Everything Everywhere All at Once)原理解读
文章目录 摘要(效果)二、前言三、相关工作四、method4.1 多用途4.2 组合性4.3 交互式。4.4 语义感知 五、实验 论文地址:https://arxiv.org/abs/2304.06718 测试代码:https://github.com/UX-Decoder/Segment-Everything-Everywher…...
Linux: command: ibstat; infiniband
文章目录 如何在Linux上安装infiniband相关的软件。ibstat相关资料 如何在Linux上安装infiniband相关的软件。 https://access.redhat.com/solutions/301643 https://docs.oracle.com/cd/E19436-01/820-3522-10/ch3-linux.html yum groupinstall “Infiniband Support” Pack…...
UML简介与类图详解
1 UML简介 1.1 UML是什么 UML,全称为Unified Model Language,即统一建模语言,是由一整套图表组成的,为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。UML 代表了一组最佳工程实践,这些实践已被证明在…...
【每日一题】1994.好子集的数目
1994.好子集的数目 题目描述解决方案:状态压缩动态规划代码:Python 题目来源:LeetCode 原文链接:https://mp.weixin.qq.com/s/myI7_ZwJM7kizrwUtWgAZQ 难度级别:困难 题目描述 给你一个整数数组 nums。如果 nums 的一…...
坚持伙伴优先,共创数据存储新生态
4 月 26 日,2023 阿里云合作伙伴大会上,阿里巴巴集团董事会主席兼 CEO、阿里云智能集团 CEO 张勇表示,阿里云的核心定位是一家云计算产品公司,生态是阿里云的根基。让被集成说到做到的核心,是要坚定走向“产品被集成”…...
树形结构的三级分类如何实现?
概述: 本三级联动分类服务端使用的是: Springboot MyBatis-plus,前端使用的是:VueElementUI,树形控件使用的是el-tree。本三级联动分类可以把任一子项拖拽到其它目录,可以添加、编辑、删除分类。 效果图:…...
SSM整合完整流程
🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公司实习…...
虹科方案 | 助力高性能视频存储解决方案-2
上篇文章《虹科方案 | 助力高性能视频存储解决方案-1》我们分享了虹科&ATTO 和 Avid 共同创建协作解决方案,助力高性能视频存储,今天我们再深入介绍一下我们的案例详情。 一、行业挑战 从高端广播设施到小型独立工作室的媒体后期制作环境都需要允许多…...
java版深圳 工程管理系统软件 自主研发,工程行业适用 软件源码
Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…...
云原生Istio架构和组件介绍
目录 1 Istio 架构2 Istio组件介绍2.1 Pilot2.2 Mixer2.3 Citadel2.4 Galley2.5 Sidecar-injector2.6 Proxy(Envoy)2.7 Ingressgateway2.8 其他组件 1 Istio 架构 Istio的架构,分为控制平面和数据面平两部分。 - 数据平面:由一组智能代理([En…...
吹爆,全网第一个手把手教你从零开始搭建Spring Cloud Alibaba的笔记
Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。 Springcloud 和 Srpingcloud Alibaba 区别? SpringCloud: 部分组件停止维护和更新,给开发带来不便;SpringCl…...
企业短信遭疯狂盗用,可能是没配置验证码
手机短信作为一种快捷的通讯方式被广泛应用。不仅在个人日常生活中,企业也习惯使用手机短信来进行验证和提醒,以保证业务的正常进行。随着数字化的发展,手机短信也成为了不法分子滥用的目标之一,给个人和企业带来不同经济损失。 个…...
【UE】直升机沿样条线移动
效果 步骤 1. 将虚幻商城中的免费资产导入工程 下载完毕后可以看到如下文件 2. 新建一个Actor蓝图类,命名为“Track”,这个蓝图就是用来画样条线的 打开“Track”,添加样条组件 3. 打开“BP_West_Heli_AH64D” 在事件图表中先新建一个时间轴…...
GaussDB_200_6.5.1部署安装
目录 安装前准备 安装依赖 修改/etc/hosts 上传解压介质 预安装 拷贝安装包 预安装配置 编辑preinstall.ini配置文件 编辑host0配置文件 执行预安装命令 安装FusionInsight_Manager 修改install安装配置文件 执行安装命令 web操作安装数据库 GaussDB200测试 配…...
软件工具 | Python调用运筹优化求解器(一):以CVRPVRPTW为例
目录 1. 引言2. 求解器介绍3. 基础语言3.1 创建模型3.2 添加变量3.3 添加目标函数3.4 添加约束3.5 设置参数3.6 求解 4. 数学模型4.1 [CVRP数学模型](https://mp.weixin.qq.com/s/DYh-5WkrYxk1gCKo8ZjvAw)4.2 [VRPTW数学模型](https://mp.weixin.qq.com/s/tF-ayzjpZfuZvelvItue…...
如何在JAVA中实现网络编程?
在Java中实现网络编程通常需要使用Java提供的网络编程库——Java Networking API。Java Networking API支持常见的TCP和UDP协议,包括Socket、ServerSocket、DatagramSocket等类,通过这些类,我们可以创建、连接、监听和传输数据。 下面是在Ja…...
【redis】redis的缓存过期淘汰策略
【redis】redis的缓存过期淘汰策略 文章目录 【redis】redis的缓存过期淘汰策略前言一、面试题二、redis内存满了怎么办?1、redis默认内存是多少?在哪查看?如何修改?在conf配置文件中可以查看 修改,内存默认是0redis的默认内存有…...
ASP.NET动态Web开发技术第8章
第8章ASP.NET数据访问 一.预习笔记 1.SqlDataSource控件 SqlDataSource数据源控件支持连接SQL关系数据库,它使用SQL命令来检索和修改数据。通常将SqlDataSource数据源控件与数据绑定控件一起使用。 属性1:ID:当前数据源控件的唯一标识符 …...
【旋转编码器如何工作以及如何将其与Arduino一起使用】
在本教程中,我们将学习旋转编码器的工作原理以及如何将其与Arduino一起使用。您可以观看以下视频或阅读下面的书面教程。 1. 概述 旋转编码器是一种位置传感器,用于确定旋转轴的角度位置。它根据旋转运动产生模拟或数字电信号。 有许多不同类型的旋转编码器按输出信号或传感…...
Tre靶场通关过程(linpeas使用+启动项编辑器提权)
Tre靶场通关 通过信息收集获得到了普通用户账号密码,利用PEASS-ng的linpeas脚本进行提权的信息收集,根据已有信息进行提权。 靶机下载地址: https://download.vulnhub.com/tre/Tre.zip 信息收集 靶机IP探测:192.168.0.129 a…...
java多线程下
ThreadLocal ThreadLocal 有什么用?通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢?JDK 中自带的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就…...
使用无标注的数据训练Bert
文章目录 1、准备用于训练的数据集2、处理数据集3、克隆代码4、运行代码5、将ckpt模型转为bin模型使其可在pytorch中运用 Bert官方仓库:https://github.com/google-research/bert 1、准备用于训练的数据集 此处准备的是BBC news的数据集,下载链接&…...
《Netty》从零开始学netty源码(五十二)之PoolThreadCache
PoolThreadCache Netty有一个大的公共内存容器PoolArena,用来管理从操作系统中获得的内存,在高并发下如果所有线程都去这个大容器获取内存它的压力是非常大的,所以Netty为每个线程建立了一个本地缓存,即PoolThreadCacheÿ…...
放弃40k月薪的程序员工作,选择公务员,我来分享一下看法
我有一个朋友,拒绝了我为他提供的4万薪水的工作,去了一个体制内的银行,做程序员,即使薪水减半。他之前在北京一家大公司做程序员,一个月30k。当我开始创业时,我拉他来和我一起干,但那时我们太小…...
【MybatisPlus】高级版可视化、可配置 自动生成代码
今天看别人使用了一个更加智能的生成代码工具,可视化、可配置策略,非常方便,配置一次,在哪都可以使用,也不会跟项目藕合下面简单说一下使用方式。 1、介绍mybatis-plus-generator-ui 主要是封装了mybatis-plus-gener…...
【图像分割】【深度学习】Windows10下f-BRS官方代码Pytorch实现
【图像分割】【深度学习】Windows10下f-BRS官方代码Pytorch实现 提示:最近开始在【图像分割】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。 文章目录 【图像分割】【深度学习】Windows10下f-BRS官方代码Pytorch实现前言f-BRS模型运行环境安装1.下载源码并…...
2023/5/4总结
刷题: 第二周任务 - Virtual Judge (vjudge.net) 这一题用到了素筛,然后穷举即可 #include<stdio.h> #define Maxsize 500000 int a[Maxsize]; long long b[Maxsize]; long long max0; int sushu() {a[0]a[1]0;int i,j,k;for(i2,k0;i<Maxsize;i){if(a[i…...
electron+vue3全家桶+vite项目搭建【17】pinia状态持久化
文章目录 引入问题演示实现效果展示、实现步骤1.封装状态初始化函数2.封装状态更新同步函数3.完整代码 引入 上一篇文章我们已经实现了electron多窗口中,pinia的状态同步,但你会发现,如果我们在一个窗口里面修改了状态,然后再打开…...
java基础入门-05-【面向对象进阶(static继承)】
Java基础入门-05-【面向对象进阶(static&继承)】 13、面向对象进阶(static&继承)1.1 如何定义类1.2 如何通过类创建对象1.3 封装1.3.1 封装的步骤1.3.2 封装的步骤实现 1.4 构造方法1.4.1 构造方法的作用1.4.2 构造方法的…...
网站建设流程与步骤/网站seo具体怎么做?
原来脚本运行很好,但是密码改成了带的密码之后就不能运行了,怎么办?sqlplus username/abc123456TNSname系统报不能解析解决思路如下:C:/>SQLPLUS "/ AS SYSDBA"SQL*Plus: Release 9.2.0.1.0 - Production on Mon Oct 6 11:15:52 2008Copyright (c) 19…...
网站的flash怎么做的/北京seo外包平台
一、用until实现下列脚本1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。#!/bin/bash#author:jackCui#description:Find out if the system has a hack…...
建设网站是什么意思/百度服务中心人工24小时电话
首先登陆mysql的交互shell,输入下面的命令查看当前数据库的编码方式 show variables like %character%; 从上面可以看出,mysql数据库装上之后初始并不均是utf8 退出刚才的交互shell,去修改下面的配置文件 输入下面的命令,打开第一…...
做网站的职责/托管竞价推广公司
在jsp中,中文乱码常会让人心乱如麻。对于中文处理的常见对策,在网上经常可见的主要是下面2种:<% pagecontentType"text/html;charsetgb2312" %>或者:<%String Hi"你好";byt…...
计算机网站建设相关的书籍/重庆seo整站优化外包服务
出处:http://blog.sina.com.cn/s/blog_7db333fb010132it.html转载于:https://www.cnblogs.com/mq0036/p/4747648.html...
顺德公司网站制作/广西南宁做网站的公司
在C#里面,属性的get 与 set 非常简单方便。 public class bird {public int age { get;set; } public bool isadult{get {return this.age > 1 ? true:false;}} }而在Python里面,属性可以直接获取或赋值。但是如果在获取或赋值时加一些逻辑判断&am…...