当前位置: 首页 > news >正文

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))
    

相关文章:

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

Scala集合概述-链接 大家可以点击上方链接,先对Scala的集合有一个整体的概念🤣🤣🤣 在 Scala 中,列表(List)分为不可变列表(List)和可变列表(ListBuffer&…...

【论文复现】偏标记学习+图像分类

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 偏标记学习图像分类 概述算法原理核心逻辑效果演示使用方式参考文献 概述 本文复现论文 Progressive Identification of True Labels for Pa…...

C嘎嘎探索篇:栈与队列的交响:C++中的结构艺术

C嘎嘎探索篇:栈与队列的交响:C中的结构艺术 前言: 小编在之前刚完成了C中栈和队列(stack和queue)的讲解,忘记的小伙伴可以去我上一篇文章看一眼的,今天小编将会带领大家吹奏栈和队列的交响&am…...

AIGC-----AIGC在虚拟现实中的应用前景

AIGC在虚拟现实中的应用前景 引言 随着人工智能生成内容(AIGC)的快速发展,虚拟现实(VR)技术的应用也迎来了新的契机。AIGC与VR的结合为创造沉浸式体验带来了全新的可能性,这种组合不仅极大地降低了VR内容的…...

Django 路由层

1. 路由基础概念 URLconf (URL 配置):Django 的路由系统是基于 urls.py 文件定义的。路径匹配:通过模式匹配 URL,并将请求传递给对应的视图处理函数。命名路由:每个路由可以定义一个名称,用于反向解析。 2. 基本路由配…...

《硬件架构的艺术》笔记(八):消抖技术

简介 在电子设备中两个金属触点随着触点的断开闭合便产生了多个信号,这就是抖动。 消抖是用来确保每一次断开或闭合触点时只有一个信号起作用的硬件设备或软件。(就是每次断开闭合只对应一个操作)。 抖动在某些模拟和逻辑电路中可能产生问…...

Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系

一.什么是Spring?它解决了什么问题? 1.1什么是Spring? Spring,一般指代的是Spring Framework 它是一个开源的应用程序框架,提供了一个简易的开发方式,通过这种开发方式,将避免那些可能致使代码…...

【算法】连通块问题(C/C++)

目录 连通块问题 解决思路 步骤: 初始化: DFS函数: 复杂度分析 代码实现(C) 题目链接:2060. 奶牛选美 - AcWing题库 解题思路: AC代码: 题目链接:687. 扫雷 -…...

如何选择黑白相机和彩色相机

我们在选择成像解决方案时黑白相机很容易被忽略,因为许多新相机提供鲜艳的颜色,鲜明的对比度和改进的弱光性能。然而,有许多应用,选择黑白相机将是更好的选择,因为他们产生更清晰的图像,更好的分辨率&#…...

Rust 力扣 - 740. 删除并获得点数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 首先对于这题我们如果将所有点数装入一个切片f中,该切片f中的i号下标表示所有点数为i的点数之和 那么这题就转换成了打家劫舍这道题,也就是求选择了切片中某个下标的元素后,该…...

OpenCV从入门到精通实战(七)——探索图像处理:自定义滤波与OpenCV卷积核

本文主要介绍如何使用Python和OpenCV库通过卷积操作来应用不同的图像滤波效果。主要分为几个步骤:图像的读取与处理、自定义卷积函数的实现、不同卷积核的应用,以及结果的展示。 卷积 在图像处理中,卷积是一种重要的操作,它通过…...

Docker核心概念总结

本文只是对 Docker 的概念做了较为详细的介绍,并不涉及一些像 Docker 环境的安装以及 Docker 的一些常见操作和命令。 容器介绍 Docker 是世界领先的软件容器平台,所以想要搞懂 Docker 的概念我们必须先从容器开始说起。 什么是容器? 先来看看容器较为…...

环形缓冲区

什么是环形缓冲区 环形缓冲区,也称为循环缓冲区或环形队列,是一种特殊的FIFO(先进先出)数据结构。它使用一块固定大小的内存空间来缓存数据,并通过两个指针(读指针和写指针)来管理数据的读写。当任意一个指针到达缓冲区末尾时,会自动回绕到缓冲区开头,形成一个"环"。…...

jQuery-Word-Export 使用记录及完整修正文件下载 jquery.wordexport.js

参考资料: jQuery-Word-Export导出word_jquery.wordexport.js下载-CSDN博客 近期又需要自己做个 Html2Doc 的解决方案,因为客户又不想要 Html2pdf 的下载了,当初还给我费尽心思解决Html转pdf时中文输出的问题(html转pdf文件下载之…...

云服务器部署WebSocket项目

WebSocket是一种在单个TCP连接上进行全双工通信的协议,其设计的目的是在Web浏览器和Web服务器之间进行实时通信(实时Web) WebSocket协议的优点包括: 1. 更高效的网络利用率:与HTTP相比,WebSocket的握手只…...

C#+数据库 实现动态权限设置

将权限信息存储在数据库中,支持动态调整。根据用户所属的角色、特定的功能模块,动态加载权限” 1. 数据库设计 根据这种需求,可以通过以下表设计: 用户表 (Users):存储用户信息。角色表 (Roles):存储角色…...

(原创)Android Studio新老界面UI切换及老版本下载地址

前言 这两天下载了一个新版的Android Studio,发现整个界面都发生了很大改动: 新的界面的一些设置可参考一些博客: Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说,没有时间去适应,那么怎么办呢&am…...

Ubuntu24虚拟机-gnome-boxes

推荐使用gnome-boxes, virtualbox构建失败,multipass需要开启防火墙 sudo apt install gnome-boxes创建完毕~...

k8s rainbond centos7/win10 -20241124

参考 https://www.rainbond.com/ 国内一站式云原生平台 对centos7环境支持不太行 [lighthouseVM-16-5-centos ~]$ curl -o install.sh https://get.rainbond.com && bash ./install.sh 2024-11-24 09:56:57 ERROR: Ops! Docker daemon is not running. Start docke…...

SpringBoot+Vue滑雪社区网站设计与实现

【1】系统介绍 研究背景 随着互联网技术的快速发展和冰雪运动的普及,滑雪作为一种受欢迎的冬季运动项目,吸引了越来越多的爱好者。与此同时,社交媒体和在线社区平台的兴起为滑雪爱好者提供了一个交流经验、分享心得、获取信息的重要渠道。滑…...

MySql.2

sql查询语句执行过程 SQL 查询语句的执行过程是一个复杂的过程,涉及多个步骤。以下是典型的关系数据库管理系统 (RDBMS) 中 SQL 查询语句的执行过程概述: 1. ‌客户端发送查询‌ 用户通过 SQL 客户端或应用程序发送 SQL 查询语句给数据库服务器。 2. ‌…...

算法之区间和题目讲解

题干 难度:简单 题目分析 题目要求算出每个指定区间内元素的总和。 然而,区间在输入的最下面,所以按照暴力破解的思路,我们首先要遍历数组,把它的值都存进去。 然后,遍历下面的区间,从索引a…...

价格分类(神经网络)

# 1.导入依赖包 import timeimport torch import torch.nn as nn import torch.optim as optimfrom torch.utils.data import TensorDataset, DataLoader from sklearn.model_selection import train_test_splitimport numpy as np import pandas as pd import matplotlib.pypl…...

对智能电视直播App的恶意监控

首先我们要指出中国广电总局推出的一个政策性文件是恶意监控的始作俑者,这个广电总局的政策性文件禁止智能电视和电视盒子安装直播软件。应该说这个政策性文件是为了保护特殊利益集团,阻挠技术进步和发展的。 有那么一些电视机和电视盒子的厂商和电信运…...

【JavaEE初阶】多线程初阶下部

文章目录 前言一、volatile关键字volatile 能保证内存可见性 二、wait 和 notify2.1 wait()方法2.2 notify()方法2.3 notifyAll()方法2.4 wait 和 sleep 的对比(面试题) 三、多线程案例单例模式 四、总结-保证线程安全的思路五、对比线程和进程总结 前言…...

macOS上进行Ant Design Pro实战教程(一)

由于一个AI项目的前端使用了umi,本教程根据阿里官网上的 《Ant Design 实战教程(beta 版)》来实操一下,我使用macOS操作系统,VS Code 开发环境。 一、开发环境 1、安装nodejs, npm, yarn 官网上建议使用cnpm&#xf…...

智能合约运行原理

点个关注吧!! 用一句话来总结,智能合约就像是一个自动售货机:你投入硬币(触发条件),选择商品(执行合约),然后机器就会自动给你商品(执行结果&…...

安卓动态添加View

在安卓应用中,有很多时候需要动态添加View。比如从后台获取商品列表,根据商品数量在页面渲染对应数量的条目,这时候就需要动态添加View。 1.动态添加View的方法 动态添加View有两种方法: 由代码生成子View:这种方式…...

前端预览pdf文件流

需求 后端接口返回pdf文件流,实现新窗口预览pdf。 解决方案 把后端返回的pdf文件流转为blob路径,利用浏览器直接预览。 具体实现步骤 1、引入axios import axios from axios;2、创建预览方法(具体使用时将axios的请求路径替换为你的后端…...

【测试工具JMeter篇】JMeter性能测试入门级教程(一)出炉,测试君请各位收藏了!!!

一、前言 Apache JMeter是纯Java的开源软件,最初由Apache软件基金会的Stefano Mazzocchi开发,旨在加载测试功能行为和测量性能。可以使用JMeter进行性能测试,即针对重负载、多用户和并发流量测试Web应用程序。 我们选择JMeter原因 是否测试过…...

网站开发常用工具/百度怎么创建自己的网站

SQLServer 中的存储过程中判断临时表是否存在,存在则删除临时表 1 2 3 4 5 6 7 8 9 10 IF OBJECT_ID(TEMPDB..#BCROSSREFERENCE ) IS NOT NULL DROP TABLE #BCROSSREFERENCE IF OBJECT_ID(TEMPDB..#SCVTMP_BCUSTOMER) IS NOT NULL DROP TABLE #SCVTMP_BCUSTOMER IF…...

重庆电商平台网站建设/百度投放广告

推荐系统全貌 一、导论 之前对推荐系统进行学习的过程中,发现自己只是拘泥于其中的一小部分进行学习,没有一个全局系统的认知,经常容易陷入困惑,因此借分享会机会,将推荐系统架构梳理一遍,在梳理的过程中…...

wordpress 中文/店铺推广引流的方法

一般情况下下拉选择框的默认值都是第一个&#xff0c;比如下面这个代码的默认值肯定是“红色”&#xff1a; <select> <option value"红色">红色</option> <option value"绿色">绿色</option> <option value"蓝色&q…...

淄博网站定制/seo优化的主要任务包括

go操作elasticsearch 使用第三方库https://github.com/olivere/elastic来连接ES并进行操作。 下载与你的ES相同版本的client&#xff0c;例如我们这里使用的ES是7.2.1的版本&#xff0c;那么我们下载的client也要与之对应为github.com/olivere/elastic/v7。 使用go.mod来管理…...

黄岛网站建设价格/汕头百度网站推广

http://scikit-learn.org/stable/modules/decomposition.html#lsa 2.5.1&#xff1a;PCA 标准PCA&#xff1a;只支持批量处理 incremental PCA&#xff1a;支持分批处理&#xff0c;对于内存容不下的情况很好 Approximate PCA&#xff1a;RandomizedPCA 通过computation to …...

手机网站如何做/点击器

西安军需工业学校都开设了哪些专业&#xff1f;西安军需工业学校是一所全日制公办院校&#xff0c;这样的办学性质&#xff0c;受到了更多学生和家长的认可&#xff0c;并且学校所开设的相关专业也让更多学生找到了未来的发展方向&#xff0c;那么西安军需工业学校都开设了哪些…...