Scala—列表(可变ListBuffer、不可变List)用法详解

Scala集合概述-链接

大家可以点击上方链接,先对Scala的集合有一个整体的概念🤣🤣🤣

在这里插入图片描述

在 Scala 中,列表(List)分为不可变列表(List)和可变列表(ListBuffer)。

1. 不可变列表(List

List 是 Scala 中一种不可变的链表数据结构(数据有顺序,可重复) 。一旦创建,就不能修改其内容,但可以通过操作返回新的列表。
在这里插入图片描述

  • 创建不可变列表
// 创建一个空的 List
val emptyList: List[Int] = List()// 创建一个包含初始元素的 List
val list1: List[Int] = List(1, 2, 3, 4, 5)// 使用 :: 操作符创建 List
val list2: List[Int] = 1 :: 2 :: 3 :: 4 :: 5 :: Nil

在这里插入图片描述

  • 添加元素

    • :::在列表头部添加一个元素
    • :+:在列表尾部添加一个元素
    • +::在列表头部添加一个元素
    val newList1 = 0 :: list // 在头部添加元素
    val newList2 = list :+ 6 // 在尾部添加元素
    val newList3 = 0 +: list // 在头部添加元素
    
  • 删除元素

    • tail:返回去掉头部元素的列表
    • drop:删除前 n 个元素
    • filter:过滤掉不符合条件的元素
    val tailList = list1.tail // 去掉头部元素
    val dropList = list1.drop(2) // 删除前 2 个元素
    val filteredList = list1.filter(_ % 2 == 0) // 过滤掉奇数
    
  • 访问元素

    • head:返回列表的第一个元素
    • apply:通过索引访问元素
    • length:返回列表的长度
    val headElement = list1.head // 返回第一个元素
    val thirdElement = list1(2) // 通过索引访问第三个元素
    val length = list1.length // 返回列表的长度
    
  • 遍历元素

    • foreach:遍历所有元素
    • map:映射所有元素
    • filter:过滤元素
    list1.foreach(println) // 遍历并打印所有元素val squaredList = list1.map(x => x * x) // 映射所有元素
    println(squaredList.mkString(", ")) // 输出: 1, 4, 9, 16, 25val evenNumbers = list1.filter(_ % 2 == 0) // 过滤偶数
    println(evenNumbers.mkString(", ")) // 输出: 2, 4
    

  1. 合并列表

    • ++:合并两个列表
    val list1 = List(1, 2, 3)
    val list2 = List(4, 5, 6)
    val combinedList = list1 ++ list2 // 结果: List(1, 2, 3, 4, 5, 6)
    
  2. 反转列表

    • reverse:反转列表
    val reversedList = list1.reverse // 结果: List(3, 2, 1)
    
  3. 排序

    • sorted:按自然顺序排序
    • sortWith:使用自定义比较器排序
    val sortedList = list1.sorted // 结果: List(1, 2, 3)
    val customSortedList = list1.sortWith(_ > _) // 结果: List(3, 2, 1)
    
  4. 查找元素

    • contains:检查列表是否包含某个元素
    • indexOf:查找元素的索引
    • lastIndexOf:查找元素的最后一个索引
    val contains2 = list1.contains(2) // 结果: true
    val index = list1.indexOf(2) // 结果: 1
    val lastIndex = list1.lastIndexOf(2) // 结果: 1
    
  5. 切片操作

    • slice:返回列表的一部分
    • take:返回前 n 个元素
    • drop:删除前 n 个元素
    • splitAt:将列表分成两部分
    val sliceList = list1.slice(1, 3) // 结果: List(2, 3)
    val takeList = list1.take(2) // 结果: List(1, 2)
    val dropList = list1.drop(2) // 结果: List(3)
    val (left, right) = list1.splitAt(2) // 结果: (List(1, 2), List(3))
    
  6. 转换操作

    • mkString:将列表转换为字符串
    • toString:返回列表的字符串表示
    val stringRepresentation = list1.mkString(", ") // 结果: "1, 2, 3"
    val toStringRepresentation = list1.toString // 结果: "List(1, 2, 3)"
    
  7. 聚合操作

    • foldLeft:从左到右聚合
    • foldRight:从右到左聚合
    • reduce:聚合所有元素
    val sum = list1.foldLeft(0)(_ + _) // 结果: 6
    val product = list1.foldRight(1)(_ * _) // 结果: 6
    val max = list1.reduce((a, b) => if (a > b) a else b) // 结果: 3
    
  8. 分组操作

    • groupBy:根据某个条件分组
    val grouped = list1.groupBy(_ % 2 == 0) // 结果: Map(false -> List(1, 3), true -> List(2))
    

2. 可变列表(ListBuffer

ListBuffer 是 Scala 中一个可变的列表类,位于 scala.collection.mutable 包中。可以高效地添加和删除元素。

在这里插入图片描述

  • 创建可变列表
import scala.collection.mutable.ListBuffer// 创建一个空的 ListBuffer
val buffer = ListBuffer[Int]()// 创建一个包含初始元素的 ListBuffer
val buffer2 = ListBuffer(1, 2, 3, 4, 5)

在这里插入图片描述

  • 添加元素
    • +=:在列表末尾添加一个元素
    • ++=:在列表末尾添加多个元素
    • prepend:在列表头部添加一个或多个元素

buffer += 1 // 在末尾添加一个元素
buffer ++= List(2, 3, 4) // 在末尾添加多个元素
buffer.prepend(0) // 在头部添加一个元素
buffer.prependAll(List(-1, -2)) // 在头部添加多个元素

在这里插入图片描述

  • 删除元素
    • -=:删除一个元素
    • --=:删除多个元素
    • remove:删除指定位置的元素

buffer -= 1 // 删除一个元素
buffer --= List(2, 3) // 删除多个元素
buffer.remove(0) // 删除第一个元素

在这里插入图片描述

  • 访问和修改元素
    • 索引访问:使用索引访问和修改元素

val firstElement = buffer(0) // 访问第一个元素
buffer(0) = 10 // 修改第一个元素

在这里插入图片描述

  • 遍历元素
    • foreach:遍历所有元素
    • map:映射所有元素
    • filter:过滤元素

buffer.foreach(println) // 遍历并打印所有元素val squaredBuffer = buffer.map(x => x * x) // 映射所有元素
println(squaredBuffer.mkString(", ")) // 输出: 100, 36, 16val evenNumbersBuffer = buffer.filter(_ % 2 == 0) // 过滤偶数
println(evenNumbersBuffer.mkString(", ")) // 输出: 36
  • 转换为其他集合类型
    • toList:转换为不可变的 List
    • toArray:转换为数组

val list = buffer.toList // 转换为不可变的 List
val array = buffer.toArray // 转换为数组

在这里插入图片描述


  1. 合并列表

    • ++=:合并两个列表
    val buffer1 = ListBuffer(1, 2, 3)
    val buffer2 = ListBuffer(4, 5, 6)
    buffer1 ++= buffer2 // 结果: ListBuffer(1, 2, 3, 4, 5, 6)
    
  2. 反转列表

    • reverse:反转列表
    val reversedBuffer = buffer1.reverse // 结果: ListBuffer(6, 5, 4, 3, 2, 1)
    
  3. 排序

    • sorted:按自然顺序排序
    • sortWith:使用自定义比较器排序
    val sortedBuffer = buffer1.sorted // 结果: ListBuffer(1, 2, 3, 4, 5, 6)
    val customSortedBuffer = buffer1.sortWith(_ > _) // 结果: ListBuffer(6, 5, 4, 3, 2, 1)
    
  4. 查找元素

    • contains:检查列表是否包含某个元素
    • indexOf:查找元素的索引
    • lastIndexOf:查找元素的最后一个索引
    val contains2 = buffer1.contains(2) // 结果: true
    val index = buffer1.indexOf(2) // 结果: 1
    val lastIndex = buffer1.lastIndexOf(2) // 结果: 1
    
  5. 切片操作

    • slice:返回列表的一部分
    • take:返回前 n 个元素
    • drop:删除前 n 个元素
    • splitAt:将列表分成两部分
    val sliceBuffer = buffer1.slice(1, 3) // 结果: ListBuffer(2, 3)
    val takeBuffer = buffer1.take(2) // 结果: ListBuffer(1, 2)
    val dropBuffer = buffer1.drop(2) // 结果: ListBuffer(3, 4, 5, 6)
    val (leftBuffer, rightBuffer) = buffer1.splitAt(2) // 结果: (ListBuffer(1, 2), ListBuffer(3, 4, 5, 6))
    
  6. 转换操作

    • mkString:将列表转换为字符串
    • toString:返回列表的字符串表示
    val stringRepresentation = buffer1.mkString(", ") // 结果: "1, 2, 3, 4, 5, 6"
    val toStringRepresentation = buffer1.toString // 结果: "ListBuffer(1, 2, 3, 4, 5, 6)"
    
  7. 聚合操作

    • foldLeft:从左到右聚合
    • foldRight:从右到左聚合
    • reduce:聚合所有元素
    val sum = buffer1.foldLeft(0)(_ + _) // 结果: 21
    val product = buffer1.foldRight(1)(_ * _) // 结果: 720
    val max = buffer1.reduce((a, b) => if (a > b) a else b) // 结果: 6
    
  8. 分组操作

    • groupBy:根据某个条件分组
    val grouped = buffer1.groupBy(_ % 2 == 0) // 结果: Map(false -> ListBuffer(1, 3, 5), true -> ListBuffer(2, 4, 6))
    

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 系统之Init进程分析

1、Init进程流程 2、Init细节逻辑 2.1 Init触发shutdown init进程触发系统重启是一个很合理的逻辑,为什么合理? init进程是android世界的一切基石,如果android世界的某些服务或者进程出现异常,那么会导致整个系统无法正常使用…

NVR录像机汇聚管理EasyNVR多个NVR同时管理基于B/S架构的技术特点与能力应用

EasyNVR视频融合平台基于云边端协同设计,能够轻松接入并管理海量的视频数据。该平台兼容性强、拓展灵活,提供了视频监控直播、录像存储、云存储服务、回放检索以及平台级联等一系列功能。B/S架构使得EasyNVR实现了视频监控的多元化兼容与高效管理。 其采…

使用ffmpeg命令实现视频文件间隔提取帧图片

将视频按每隔五秒从视频中提取一张图片 使用 ffmpeg 工具,通过设置 -vf(视频过滤器)和 -vsync 选项 命令格式 ffmpeg -i input_video.mp4 -vf "fps1/5" output_%03d.png 解释: -i input_video.mp4:指定输…

Java安全—原生反序列化重写方法链条分析触发类

前言 在Java安全中反序列化是一个非常重要点,有原生态的反序列化,还有一些特定漏洞情况下的。今天主要讲一下原生态的反序列化,这部分内容对于没Java基础的来说可能有点难,包括我。 序列化与反序列化 序列化:将内存…

现代网络架构PCI DSS合规范围确定和网络分割措施实施探讨

本文为atsec和作者技术共享类文章,旨在共同探讨信息安全业界的相关话题。未经许可,任何单位及个人不得以任何方式或理由对本文的任何内容进行修改。转载请注明:atsec信息安全和作者名称 1 引言 支付卡行业数据安全标准 (P…

docker快速部署gitlab

文章目录 场景部署步骤默认账号密码效果 场景 新增了一台机器, 在初始化本地开发环境,docker快速部署gitlab 部署步骤 编写dockerfile version: 3.7services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwayshostname: gitlabenviron…

Kubernetes 01

MESOS:APACHE 分布式资源管理框架 2019-5 Twitter退出,转向使用Kubernetes Docker Swarm 与Docker绑定,只对Docker的资源管理框架,阿里云默认Kubernetes Kubernetes:Google 10年的容器化基础框架,borg…

芯科科技率先支持Matter 1.4,推动智能家居迈向新高度

Matter 1.4引入核心增强功能、支持新设备类型,持续推进智能家居互联互通 近日,连接标准联盟(Connectivity Standard Alliance,CSA)发布了Matter 1.4标准版本。作为连接标准联盟的重要成员之一,以及Matter标…

Redis 分布式锁实现方案

一、概述 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级…

数据结构-最小生成树

一.最小生成树的定义 从V个顶点的图里生成的一颗树,这颗树有V个顶点是连通的,有V-1条边,并且边的权值和是最小的,而且不能有回路 二.Prim算法 Prim算法又叫加点法,算法比较适合稠密图 每次把边权最小的顶点加入到树中&#xff0…

ASP.NET Web(.Net Framework) Http服务器搭建以及IIS站点发布

ASP.NET Web(.Net Framework) Http服务器搭建以及IIS站点发布 介绍创建ASP.NET Web (.Net Framework)http服务器创建项目创建脚本部署Http站点服务器测试 Get测试编写刚才的TestWebController.cs代码如下测试写法1测试写法2 Post测…

【AI系统】昇腾 AI 架构介绍

昇腾 AI 架构介绍 昇腾计算的基础软硬件是产业的核⼼,也是 AI 计算能⼒的来源。华为,作为昇腾计算产业⽣态的⼀员,是基础软硬件系统的核⼼贡献者。昇腾计算软硬件包括硬件系统、基础软件和应⽤使能等。 而本书介绍的 AI 系统整体架构&#…

org.apache.commons.lang3包下的StringUtils工具类的使用

前言 相信平时在写项目的时候,一定使用到StringUtils.isEmpty();StringUtils.isBlank();但是你真的了解他们吗? 也许你两个都不知道,也许你除了isEmpty/isNotEmpty/isNotBlank/isBlank外,并不知道还有isAnyEmpty/isNon…

vscode中json文件的注释飘红

vscode的json文件 添加注释,提示json中不允许有注释,点编辑器最下面的json,如下图 然后选择如上图的json with comments就好了

【AI日记】24.11.30 kaggle 比赛 Titanic-3

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 内容:学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster,学习机器学习课程时间:5 小时评估:继续 读书 书名:美丽新世界时间&a…

抓包之查看websocket内容

写在前面 本文看下websocket抓包相关内容。 1:正文 websocket基础环境搭建参考这篇文章。 启动后,先看chrome的network抓包,这里我们直接使用is:running来过滤出websocket的请求: 可以清晰的看到发送的内容以及响应的内容。在…

开源项目:纯Python构建的中后台管理系统

来源:Python大数据分析 费弗里 大家好我是费老师,目前市面上有很多开源的「中后台管理系统」解决方案,复杂如「若依」那种前端基于Vue,后端基于Java的框架,虽然其提供了较为完善的一整套前后端分离权限管理系统解决方…

Power BI - Connect to SharePoint online list with Image column

1.简单介绍 当前SharePoint online list有modern和classic两种模式,现在使用modern模式的比较多。list中有Image类型的列,Power BI如何连接到SharePoint list并显示image呢 note, SharePoint list中的Image列,Lookup列,People列…

DroneCAN 最新开发进展,Andrew在Ardupilot开发者大会2024的演讲

本文是Andrew演讲的中文翻译,你可以直接观看视频了解演讲的全部内容,此演讲视频的中文版本已经发布在Ardupilot社区的Blog板块,你可以在 Arudpilot官网(https://ardupilot.org) 获取该视频: 你也可以直接通过Bilibili链…

DataWhale—PumpkinBook(TASK07支持向量机)

课程开源地址及相关视频链接:(当然这里也希望大家支持一下正版西瓜书和南瓜书图书,支持文睿、秦州等等致力于开源生态建设的大佬✿✿ヽ(▽)ノ✿) Datawhale-学用 AI,从此开始 【吃瓜教程】《机器学习公式详解》(南瓜…