scala-集合2
可变数组
定义变长数组
val arr01 = ArrayBuffer[Any](3, 2, 5)
(1)[Any]存放任意数据类型
(2)(3, 2, 5)初始化好的三个元素
(3)ArrayBuffer 需要引入 scala.collection.mutable.ArrayBuffer
案例实操
- ArrayBuffer 是有序的集合
- 增加元素使用的是 append 方法(),支持可变参数
import scala.collection.mutable.ArrayBuffer
object TestArrayBuffer {def main(args: Array[String]): Unit = {//(1)创建并初始赋值可变数组val arr01 = ArrayBuffer[Any](1, 2, 3)//(2)遍历数组for (i <- arr01) { println(i) }println(arr01.length) // 3 println("arr01.hash=" + arr01.hashCode())//(3)增加元素//(3.1)追加数据arr01 +=(4)//(3.2)向数组最后追加数据arr01.append(5,6)//(3.3)向指定的位置插入数据arr01.insert(0,7,8)println("arr01.hash=" + arr01.hashCode())//(4)修改元素arr01(1) = 9 //修改第2个元素的值println("----------------------------")for (i <- arr01) { println(i) }println(arr01.length) // 5}
}
不可变数组与可变数组的转换
说明
arr1.toBuffer //不可变数组转可变数组
arr2.toArray //可变数组转不可变数组
- 不可变数组转可变数组:使用
to buffer函数,返回一个新的可变数组,原数组不变。 - 可变数组转不可变数组:使用
to array函数,返回一个新的不可变数组,原数组不变。
object TestArrayBuffer {
def main(args: Array[String]): Unit = {// (1) 创建一个空的可变数组val arr2 = ArrayBuffer[Int]()// (2) 追加值arr2.append(1, 2, 3)println(arr2) // 1,2,3// (3) ArrayBuffer ==> Array// (3.1) arr2 toArray 返回的结果是一个新的定长数组集合// (3.2) arr2 它没有任何变化val newArr = arr2.toArrayprintln(newArr)// (4) Array ===> ArrayBuffer// (4.1) newArr toBuffer 返回一个变长数组 newArr2// (4.2) newArr 没有任何变化,依然是定长数组val newArr2 = newArr.toBuffernewArr2.append(123)println(newArr2)}
}
多维数组
val arr = Array.ofDim[Double](3,4)
创建多维数组:使用 array of 函数,指定数据类型和规格(如三行四列)。
遍历多维数组:使用嵌套的 for 循环,逐行逐列遍历数组元素。
列表(List)
不可变列表:默认情况下,列表是不可变的,数据有序且可重复。
List 增加数据
集合间合并:将一个整体拆成一个一个的个体,称为扁平化
空集合 Nil
可变列表:使用 list buffer,需要导入相关包,支持添加、插入、修改和删除操作。
遍历列表:使用 for each 循环遍历列表元素。
实操案例
// 不可变list
object TestList {def main(args: Array[String]): Unit = {// (1) List默认为不可变集合// (2) 创建一个List(数据有顺序,可重复)val list: List[Int] = List(1,2,3,4,5)// (7) 空集合Nilval list5 = 1::2::3::4::Nil// (4) List增加数据// (4.1) ::的运算规则从右向左// val list1 = 5::list val list1 = 7::6::5::list// (4.2) 添加到第一个元素位置val list2 = list.+(5)// (5) 集合间合并:将一个整体拆成一个一个的个体,称为扁平化val list3 = List(8,9)// val list4 = list3::list1 val list4 = list3::list1// (6) 取指定数据println(list(0))// (3) 遍历List// list.foreach(println)// list1.foreach(println)// list3.foreach(println)// list4.foreach(println)list5.foreach(println)}
}// 可变ListBuffer
import scala.collection.mutable.ListBuffer
object TestList {def main(args: Array[String]): Unit = {// (1) 创建一个可变集合val buffer = ListBuffer(1, 2, 3, 4)// (2) 向集合中添加数据buffer += 5buffer.append(6)buffer.insert(1, 2)// (3) 打印集合数据buffer.foreach(println)// (4) 修改数据buffer(1) = 6buffer.update(1, 7)// (5) 删除数据buffer -= 5buffer -= 5buffer.remove(5)}
}
集合(Set)
默认情况下, Scala 使用的是不可变集合, 如果你想使用可变集合, 需要引用scala.collection.mutable.Set 包
不可变集合(Set):数据无序且不可重复,使用 set 关键字创建,遍历时重复元素会被忽略。
可变集合( mutable.Set):使用 mutable.set,支持打印集合、添加、删除操作,添加元素会返回新的集合。
// 不可变 Set
object TestSet {def main(args: Array[String]): Unit = {//(1)Set默认是不可变集合,数据无序val set = Set(1,2,3,4,5,6)//(2)数据不可重复val set1 = Set(1,2,3,4,5,6,3)//(3)遍历集合for(x<-set1){println(x)}
}// 可变mutable.Set
object TestSet{def main(args: Array[String]): Unit = {//(1)创建可变集合val set = mutable.Set(1,2,3,4,5,6)//(3)集合添加元素set += 8//(4)向集合中添加元素,返回一个新的 Setval ints = set.+(9)println(ints) println("set2=" + set)//(5)删除数据set -= (5)//(2)打印集合set.foreach(println) println(set.mkString(","))}
}
Map(映射)集合
Scala 中的 Map 和 Java 类似,也是一个散列表,它存储的内容也是键值对(key-value) 映射
不可变Map:使用 map 关键字创建,存储键值对,数据无序,键(key)不可重复
访问数据:使用 get 方法,如果键不存在则返回默认值(如0)。
遍历映射:使用 for each 循环遍历键值对。
可变Map:使用 mutable map,支持打印集合、添加、删除、修改操作。
添加数据:使用 + 操作符添加键值对。
删除数据:使用 - 操作符删除指定键的键值对。
修改数据:直接通过键赋值修改。
// 不可变Map
object TestMap {def main(args: Array[String]): Unit = {// Map// (1) 创建不可变集合 Mapval map = Map("a" -> 1, "b" -> 2, "c" -> 3)// (3) 访问数据for (elem <- map.keys) {// 使用 get 访问 map 集合的数据,会返回特殊类型 Option(选项):有值(Some),无值(None)println(elem + "=" + map.get(elem).get)}// (4) 如果 key 不存在,返回 0println(map.getOrElse("d", 0))println(map.getOrElse("d", 0))// (2) 循环打印map.foreach((kv) => { println(kv) })}
}// 可变Map
object TestSet {def main(args: Array[String]): Unit = {// (1) 创建可变集合val map = mutable.Map("a" -> 1, "b" -> 2, "c" -> 3)// (3) 向集合增加数据map += ("d" -> 4)// 将数值 4 添加到集合,并把集合中原值 1 返回val maybeInt: Option[Int] = map.put("a", 4)println(maybeInt.getOrElse(0))// (4) 删除数据map -= ("b", "c")// (5) 修改数据map.update("d", 5)map("d") = 5// (2) 打印集合map.foreach((kv) => { println(kv) })}
}
注意事项
数据结构的选择:根据需求选择合适的数据结构,如有序且可重复的列表,无序且不可重复的集合。
操作的正确性:确保操作的变量类型正确,特别是在涉及可变和不可变数据结构时。
元组
元组也是可以理解为一个容器,可以存放各种相同或不同类型的数据。说的简单点,就是将多个无关的数据封装为一个整体,称为元组。
注意:
元组可容纳各种类型的数据,最大只能有 22 个元素。
声明方式为元素间用逗号分隔。
可通过点杠或索引访问元素,也能用迭代器访问。
案例实操
声明元组的方式:(元素 1,元素 2,元素 3)
访问元组
Map 中的键值对其实就是元组,只不过元组的元素个数为 2,称之为对偶
object TestTuple {def main(args: Array[String]): Unit = {// (1) 声明元组的方式:(元素1,元素2,元素3)val tuple: (Int, String, Boolean) = (40,"bobo",true)// (2) 访问元组// (2.1) 通过元素的顺序进行访问,调用方式:_顺序号println(tuple._1)println(tuple._2)println(tuple._3)// (2.2) 通过索引访问数据println(tuple.productElement(0))// (2.3) 通过迭代器访问数据for (elem <- tuple.productIterator) { println(elem) }// (3) Map 中的键值对其实就是元组,只不过元组的元素个数为 2,称之为对偶val map = Map("a"->1, "b"->2, "c"->3) val map1 =Map(("a",1), ("b",2), ("c",3))map.foreach(tuple=>{println(tuple._1 + "=" + tuple._2)})}
}
集合常用函数
基本属性和常见操作
包括获取集合长度(size)和大小(size)。
循环遍历用 for each,迭代器用 for 循环,生成字符串用点 mkString。
判断是否包含特定值。
object TestList {def main(args: Array[String]): Unit = {val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7)// (1) 获取集合长度println(list.length)// (2) 获取集合大小,等同于 lengthprintln(list.size)// (3) 循环遍历list.foreach(println)// (4) 迭代器for (elem <- list.iterator) { println(elem) }// (5) 生成字符串println(list.mkString(","))//(6)是否包含println(list.contains(3))}
}
衍生集合
获取列表的头、尾、最后一个数据,初始值为零,集合初始数据(不包含最后一个)
可进行反转、取前几个或后几个数据(take、take right),删除前几个或后几个元素(drop、drop right),求并集(union)、交集(intersect)、差集(diff)、拉链(zip)、滑窗(sliding)操作
object TestList {def main(args: Array[String]): Unit = {val list1: List[Int] = List(1, 2, 3, 4, 5, 6, 7)val list2: List[Int] = List(4, 5, 6, 7, 8, 9, 10)//(1)获取集合的头println(list1.head)//(2)获取集合的尾(不是头的的就是尾)println(list1.tail)//(3)集合最后一个数据println(list1.last)//(4)集合初始数据(不包含最后一个)println(list1.init)//(5)反转println(list1.reverse)//(6)取前(后)n个元素println(list1.take(3)) println(list1.takeRight(3))//(7)去掉前(后)n个元素println(list1.drop(3))println(list1.dropRight(3))//(8)并集println(list1.union(list2))//(9)交集println(list1.intersect(list2))//(10)差集println(list1.diff(list2))//(11)拉链 注:如果两个集合的元素个数不相等,那么会将同等数量的数据进行拉链,多余的数据省略不用println(list1.zip(list2))//(12)滑窗list1.sliding(2, 5).foreach(println)}
}
集合计算简单函数
涉及求和、求乘积、求最大值、最小值和排序。
排序有按元素大小(sort)、按绝对值、升序(ascending)、降序(descending)等方式。
object TestList {def main(args: Array[String]): Unit = {val list: List[Int] = List(1, 5, -3, 4, 2, -7, 6)//(1)求和println(list.sum)//(2)求乘积println(list.product)//(3)最大值println(list.max)//(4)最小值println(list.min)//(5)排序//(5.1)按照元素大小排序println(list.sortBy(x => x))//(5.2)按照元素的绝对值大小排序println(list.sortBy(x => x.abs))//(5.3)按元素大小升序排序println(list.sortWith((x, y) => x < y))//(5.4)按元素大小降序排序println(list.sortWith((x, y) => x > y))}
}
(1) sorted
对一个集合进行自然排序,通过传递隐式的 Ordering
(2) sortBy
对一个属性或多个属性进行排序,通过它的类型。
(3) sortWith
基于函数的排序,通过一个 comparator 函数,实现自定义排序的逻辑。
相关文章:
scala-集合2
可变数组 定义变长数组 val arr01 ArrayBuffer[Any](3, 2, 5) (1)[Any]存放任意数据类型 (2)(3, 2, 5)初始化好的三个元素 (3)ArrayBuffer 需要引入 scala.collection.mutable.ArrayBuffer 案例实操 Arra…...
[Linux系统编程]多线程
多线程 1. 线程1.1 线程的概念1.2 进程与线程对比1.3 轻量级进程 2. Linux线程控制2.1 POSIX 线程(pthread)2.2 线程ID、pthread_t、和进程地址空间的关系2.2.1 pthread_self2.2.2 pthread_create2.2.3 pthread_join2.2.4 线程终止的三种方式2.2.5 pthre…...
IntelliJ IDEA下开发FPGA——FPGA开发体验提升__下
前言 由于Quartus写代码比较费劲,虽然新版已经有了代码补全,但体验上还有所欠缺。于是使用VS Code开发,效果如下所示,代码样式和基本的代码补全已经可以满足开发,其余工作则交由Quartus完成 但VS Code的自带的git功能&…...
odo18实施——销售-仓库-采购-制造-制造外包-整个流程自动化单据功能的演示教程
安装模块 安装销售 、库存、采购、制造模块 2.开启外包功能 在进入制造应用点击 配置—>设置 勾选外包,点击保存 添加信息 一、添加客户信息 点击到销售应用 点击订单—>客户 点击新建 创建客户1,及其他客户相关信息,点…...
微信小程序生成某个具体页面的二维码
微信小程序,如果要生成某个具体页面,而非首页的二维码,体验和正式的生成方法如下: 1、体验版二维码: 管理---版本管理---修改页面路径,输入具体页面的路径以及参数,生成的是二维码 2、正式小程…...
鸿蒙开发_ARKTS快速入门_语法说明_组件声明_组件手册查看---纯血鸿蒙HarmonyOS5.0工作笔记010
然后我们来看如何使用组件 可以看到组件的组成 可以看到我们使用的组件 然后看一下组件的语法.组件中可以使用子组件. 然后组件中可以有参数,来修改组件的样式等 可以看到{},这种方式可以设置组件参数,当然在下面. 的方式也可以的 然后再来...
利用解析差异SSRF + sqlite注入 + waf逻辑漏洞 -- xyctf 2025 fate WP
本文章附带TP(Thinking Process)! #!/usr/bin/env python3 # 导入所需的库 import flask # Flask web框架 import sqlite3 # SQLite数据库操作 import requests # HTTP请求库 import string # 字符串处理 import json # JSON处理app flask.Flask(__name__) # 创建Flask应…...
接口异常数组基础题
题目描述 设想你正在构建一个智能家居控制系统。这个系统可以连接多种不同类型的智能设备,如智能灯泡、智能空调和智能门锁。每种设备都有其独特的功能,不过它们也有一些通用的操作,像开启、关闭和获取设备状态等。系统需要提供一个方法来控…...
rustdesk折腾手记
背景 我的工作环境:主力电脑是macPro, 另外一台ThinkPad W530作为开发机,装的是LinuxMint,还有一台ThinkPad P15作为服务器。平常显示器接到macPro,在macOS上通过微软的远程桌面连接到另外两台Linux。基本访问比较流畅࿰…...
使用el-tab 实现两个tab切换
1、主页面 index.vue 2、tab1:school.vue 3、tab2:parent.vue 具体代码如下: <template><div class"app-container"><!-- 使用el-tabs 实现两个组件的切换 --><el-tabs v-model"activeName" typ…...
JAVA--流(Stream)的使用
一、概念 JDK8新特性,简单方便的对集合和数组进行处理。 Stream(流)是一个来自数据源的元素队列 数据源:流的来源,指的是集合或数组 元素队列:元素是特定类型的对象,形成一个队列 Stream 并…...
使用ExcelJS实现专业级医疗数据导出功能:从数据到Excel报表的完整指南
在现代医疗信息系统中,数据导出是医护人员和行政人员日常工作中的重要需求。本文将详细介绍如何使用ExcelJS库在前端实现专业级的医疗数据导出功能,特别是针对住院缴费记录这类关键业务数据。 功能概述 这个exportExcel函数实现了以下核心功能…...
使用Pholcus编写Go爬虫示例
想用Pholcus库来写一个Go的爬虫程序。首先,我得确认Pholcus的当前状态,因为之前听说过它可能已经不再维护了。不过用户可能还是需要基于这个库的示例,所以得先提供一个基本的框架。 首先,我应该回忆一下Pholcus的基本用法。Pholc…...
深入解析大型应用架构:以dify为例进行分析
原文:https://juejin.cn/post/7437015214351286309 Dify 是一款开源的大语言模型(LLM)应用开发平台,旨在简化和加速生成式 AI 应用的创建和部署。 它融合了后端即服务(Backend as a Service, BaaS)和 LLM…...
单片机实现触摸按钮执行自定义任务组件
触摸按钮执行自定义任务组件 项目简介 本项目基于RT8H8K001开发板 RT6809CNN01开发板 TFT显示屏(1024x600) GT911触摸屏实现了一个多功能触摸按钮组件。系统具备按钮控制后执行任务的功能,可用于各类触摸屏人机交互场景。 硬件平台 MCU: STC8H8K64U࿰…...
快速入手-前后端分离Python权限系统 基于Django5+DRF+Vue3.2+Element Plus+Jwt
引用:打造前后端分离Python权限系统 基于Django5DRFVue3.2Element PlusJwt 视频教程 (火爆连载更新中..)_哔哩哔哩_bibili 说明:1、结合个人DRF基础和该视频去根据自己的项目进行开发。 2、引用该视频中作者的思路去升华自身的项…...
【go】slice的浅拷贝和深拷贝
浅拷贝(Shallow Copy) 浅拷贝是指只复制切片本身的结构(指针、长度和容量),而不复制底层数组的元素。 实现方式 直接赋值: slice1 : []int{1, 2, 3} slice2 : slice1 // 浅拷贝切片操作: slice1 : []int{1, 2, 3} s…...
Ai云防护技术解析——服务器数据安全的智能防御体系
本文深度解析AI云防护技术如何通过智能流量分析、动态行为建模、自适应防御策略构建服务器安全体系。结合2023年群联科技实战案例,揭示机器学习算法在识别新型DDoS攻击、加密流量检测、零日漏洞防御中的技术突破,并附Gartner最新防护效果验证数据。 AI驱动的流量特征建模技术…...
科技快讯 | DeepSeek 公布模型新学习方式;Meta发布开源大模型Llama 4;谷歌推出 Android Auto 14.0 正式版
Meta发布开源大模型Llama 4,首次采用“混合专家架构“ 4月6日,Meta推出开源AI模型Llama 4,包括Scout和Maverick两个版本,具备多模态处理能力。Scout和Maverick参数量分别为170亿和4000亿,采用混合专家架构。Meta同时训…...
JSONP跨域访问漏洞
一、漏洞一:利用回调GetCookie <?php$conn new mysqli(127.0.0.1,root,root,learn) or die("数据库连接不成功"); $conn->set_charset(utf8); $sql "select articleid,author,viewcount,creattime from learn3 where articleid < 5"; $result…...
记录一次StarRocks集群迁移的经历
记录一次StarRocks集群迁移的经历 新入职了一家公司,刚去做了两张报表后,接到一个任务,做StarRocks 集群迁移,背景是这样的就是以前是自建的SR,但是这个SR 是给线上业务用的,也就是说不是分析性业务,而是面向产品ToC 的,也了解了一下是因为单表数据量太大了,所以直接…...
图形裁剪算法
1.学习目标 理解区域编码(Region Code,RC) 设计Cohen-Sutherland直线裁剪算法 编程实现Cohen-Sutherland直线裁剪算法 2.具体代码 1.具体算法 /*** Cohen-Sutherland直线裁剪算法 - 优化版* author AI Assistant* license MIT*/// 区域编码常量 - 使用对象枚举…...
Python字典实战: 三大管理系统开发指南(班级+会议+购物车)(附源码)
目录 摘要 一、班级管理系统(含成绩模块) 1. 功能概述 2. 完整代码与解析 3. 代码解析与亮点 二、会议管理系统 1. 功能概述 2. 完整代码 3. 代码解析与亮点 三、购物车管理系统 1. 功能概述 2. 完整代码 3. 代码解析与亮点 四、总结与扩…...
R 语言科研绘图第 36 期 --- 饼状图-基础
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
vue 3 从零开始到掌握
vue3从零开始一篇文章带你学习 升级vue CLI 使用命令 ## 查看vue/cli版本,确保vue/cli版本在4.5.0以上 vue --version ## 安装或者升级你的vue/cli npm install -g vue/cli ## 创建 vue create vue_test ## 启动 cd vue_test npm run servenvm管理node版本&#…...
【R语言绘图】圈图绘制代码
绘制代码 rm(list ls())# 加载必要包 library(data.table) library(circlize) library(ComplexHeatmap) library(rtracklayer) library(GenomicRanges) library(BSgenome) library(GenomicFeatures) library(dplyr)### 数据准备阶段 ### # 1. 读取染色体长度信息 df <- re…...
OCR迁移
一、环境 操作系统:Centos57.6 数据库版本:12.2.0.1 场景:将OCR信息从DATA磁盘组迁移到OCR磁盘组 二、操作步骤 1.查看可用空盘 set lin 200 set pagesize 200 col DGNAME format a15 col DISKNAME format a15 col PATH format a20 col N…...
OpenCV 图形API(17)计算输入矩阵 src 中每个元素的平方根函数sqrt()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 描述 计算数组元素的平方根。 cv::gapi::sqrt 函数计算每个输入数组元素的平方根。对于多通道数组,每个通道会独立处理。其精度大约与内置的 …...
python中的in关键字查找的时间复杂度
列表(List) 对于列表来说, in 运算符的复杂度是 O(n),其中n是列表的长度。这意味着如果列表中有n个元素,那么执行 in 运算符需要遍历整个列表来查找目标元素。 以下是一个示例,演示了在列表中使用 in 运算…...
Python爬虫第6节-requests库的基本用法
目录 前言 一、准备工作 二、实例引入 三、GET请求 3.1 基本示例 3.2 抓取网页 3.3 抓取二进制数据 3.4 添加headers 四、POST请求 五、响应 前言 前面我们学习了urllib的基础使用方法。不过,urllib在实际应用中存在一些不便之处。以网页验证和Cookies处理…...
