集合学习内容总结

news2025/4/16 11:26:30

集合简介

1、Scala 的集合有三大类:序列 Seq、集Set、映射 Map,所有的集合都扩展自 Iterable

特质。

2、对于几乎所有的集合类,Scala 都同时提供了可变不可变的版本,分别位于以下两个包

不可变集合:scala.collection.immutable

可变集合: scala.collection.mutable

3、Scala 不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象, 而不会对原对象进行修改。类似于 java 中的 String

4、对象可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。类似于 java 中 StringBuilder 对象

数组

不可变数组

1、第一种方式定义数组

定义:val arr1 = new Array[Int](10)

(1)new 是关键字

(2)[Int]是指定可以存放的数据类型,如果希望存放任意数据类型,则指定Any

(3)(10),表示数组的大小,确定后就不可以变化

object FixedArrayDemo {
  def main(args: Array[String]): Unit = {
    // 严格遵循要求的定义
    val arr1 = new Array[Int](10) // (1) new关键字 (2) [Int]类型 (3) 固定长度10
    
    // 类型验证演示
    val anyArr = new Array[Any](3) // 可存任意类型的版本
    
    // 初始值验证(Int数组初始化为0)
    println("初始数组值:")
    println(arr1.mkString(", "))  // 输出:0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    
    // 合法操作演示
    arr1(0) = 100      // 修改第一个元素
    arr1(arr1.length-1) = 999  // 修改最后一个元素(索引9)
    
    // 类型安全验证(这行如果取消注释会编译报错)
    // arr1(1) = "hello"  // 类型不匹配,因为声明的是Int数组
    
    // 长度不可变验证(这行如果取消注释会运行时报错)
    // arr1(10) = 1000    // 索引越界(有效索引0-9)
    
    // 最终结果输出
    println("\n修改后的数组值:")
    println(arr1.mkString(", "))  // 输出:100, 0, ..., 999
  }
}

2、第二种方式定义数组

val arr1 = Array(1, 2)

(1)在定义数组时,直接赋初始值

(2)使用apply 方法创建数组对象

object TestArray{

   def main(args: Array[String]): Unit = {

      var arr02 = Array(1, 3, "bobo")
      println(arr02.length)
      for (i <- arr02) {
          println(i)
      }
   }
}

可变数组

定义变长数组

val arr01 = ArrayBuffer[Any](3, 2, 5)

(1)[Any]存放任意数据类型

(2)(3, 2, 5)初始化好的三个元素

(3)ArrayBuffer 需要引入 scala.collection.mutable.ArrayBuffer

 

import scala.collection.mutable.ArrayBuffer

object VariableArrayDemo {
  def main(args: Array[String]): Unit = {
    // 严格按要求定义可变数组
    val arr01 = ArrayBuffer[Any](3, 2, 5)  // (1) [Any]类型 (2) 初始化3个元素 (3) 需要显式导入
    
    // 打印初始状态
    println("初始数组:")
    println(s"长度: ${arr01.length}, 内容: ${arr01.mkString(", ")}")  // 长度: 3, 内容: 3, 2, 5
    
    // 演示添加混合类型元素(利用Any特性)
    arr01 += "hello"           // 添加String类型
    arr01 += true              // 添加Boolean类型
    arr01 += Array(7.5, 8.5)   // 添加嵌套数组
    
    // 动态修改演示
    arr01(0) = "替换后的值"       // 修改第一个元素为字符串
    arr01 -= 2                 // 删除元素2(值删除而非索引)
    
    // 打印修改后状态
    println("\n修改后的数组:")
    println(s"长度: ${arr01.length}, 内容: ${arr01.mkString(", ")}")
    // 长度: 6, 内容: 替换后的值, 5, hello, true, [D@哈希值
    
    // 典型操作验证(注释部分为错误示例)
    // arr01(10) = 100       // 索引越界(当前最大索引5)
    // arr01 += 1.23         // 合法操作(Double属于Any)
    // arr01 += List(1,2,3) // 合法操作(List属于Any)
  }
}

 不可变数组与可变数组的转换

arr1.toBuffer   //不可变数组转可变数组

arr2.toArray    //可变数组转不可变数组

  1. arr2.toArray 返回结果才是一个不可变数组,arr2 本身没有变化
  2. arr1.toBuffer 返回结果才是一个可变数组,arr1 本身没有变化
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.toArray println(newArr)

      //(4)Array ===> ArrayBuffer
      //(4.1)newArr.toBuffer 返回一个变长数组 newArr2
      //(4.2)newArr 没有任何变化,依然是定长数组val newArr2 = newArr.toBuffer 
      newArr2.append(123)

      println(newArr2)
  }
}

 

列表(List)

列表是 Scala 中最常用的集合类型之一,默认为不可变集合。

不可变 List‌:使用 List 类创建,一旦创建就不能修改。

object TestList {

   def main(args: Array[String]): Unit = {

   //(1)List 默认为不可变集合
   //(2)创建一个 List(数据有顺序,可重复)
   val list: List[Int] = List(1,2,3,4,3)

   //(7)空集合 Nil
   val 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‌:使用 ListBuffer 类创建,可以动态修改。

Set 集合

Set 集合是无序且不包含重复元素的集合。

不可变 Set‌:使用 Set 类创建。

可变 Set‌:使用 mutable.Set 类创建。

Map 集合

Map 集合是键值对(key-value)的集合,类似于 Java 中的 HashMap。

不可变 Map‌:使用 Map 类创建。

可变 Map‌:使用 mutable.Map 类创建。

元组(Tuple)

元组是一个可以包含多个不同类型元素的容器,最大可以有 22 个元素。

声明元组‌:使用小括号和逗号分隔元素,如 (1, "a", true)

访问元组‌:通过下划线 _ 和元素的索引来访问,如 tuple._1

集合常用函数
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)获取集合大小,等同于 length 
    println(list.size)

    //(3)循环遍历
    list.foreach(println)

    //(4)迭代器
    for (elem <- list.itera tor)
      { println(elem)
    }

    //(5)生成字符串
    println(list.mkString(","))

    //(6)是否包含
    println(list.contains(3))
  }
}

Scala 集合提供了丰富的操作函数,包括遍历、过滤、映射、排序等。

基本属性和常用操作‌:如 lengthsizeforeachmkStringcontains 等。

衍生集合‌:如 headtaillastinitreversetakedrop 等。

集合计算简单函数‌:如 sumproductmaxminsortBysortWith 等。

集合计算高级函数‌:如 filtermapflattenflatMapgroupByreducefold 等。

 

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

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

相关文章

51.评论日记

千万不能再挖了&#xff0c;否则整个华夏文明将被改写。_哔哩哔哩_bilibili 2025年4月7日22:13:42

SpringCloud第二篇:注册中心Eureka

注册中心的意义 注册中心 管理各种服务功能包括服务的注册、发现、熔断、负载、降级等&#xff0c;比如dubbo admin后台的各种功能。 有了注册中心&#xff0c;调用关系的变化&#xff0c;画几个简图来看一下。(了解源码可求求: 1791743380) 服务A调用服务B 有了注册中心之后&a…

ES 参数调优

1、refresh_interval 控制索引刷新的时间间隔。增大这个值可以减少I/O操作&#xff0c;从而提升写入性能&#xff0c;但会延迟新文档的可见性 查看 GET /content_erp_nlp_help_202503191453/_settings?include_defaultstrue 动态修改&#xff1a;refresh_interval 是一个动态…

用claude3.7,不到1天写了一个工具小程序(11个工具6个游戏)

一、功能概览和本文核心 本次开发&#xff0c;不是1天干撸&#xff0c;而是在下班后或早起搞的&#xff0c;总体加和计算了一下&#xff0c;大概1天的时间&#xff08;12个小时&#xff09;&#xff0c;平常下班都是9点的衰仔&#xff0c;好在还有双休&#xff0c;谢天谢地。 …

【GeoDa使用】空间自相关分析操作

使用 GeoDa 软件进行空间自相关分析 双击打开 GeoDa 软件 选择 .shp 文件 导入文件 空间权重矩阵&#xff08;*.gal / *.gwt&#xff09;是进行任何空间分析的前提 构建空间权重矩阵 空间权重矩阵&#xff08;Spatial Weights Matrix&#xff09; 是一个用来描述空间对象之间…

C++基于rapidjson的Json与结构体互相转换

简介 使用rapidjson库进行封装&#xff0c;实现了使用C对结构体数据和json字符串进行互相转换的功能。最短只需要使用两行代码即可无痛完成结构体数据转换为Json字符串。 支持std::string、数组、POD数据&#xff08;int,float,double等&#xff09;、std::vector、嵌套结构体…

OpenStack Yoga版安装笔记(十七)安全组笔记

一、安全组与iptables的关系 OpenStack的安全组&#xff08;Security Group&#xff09;默认是通过Linux的iptables实现的。以下是其主要实现原理和机制&#xff1a; 安全组与iptables的关系 OpenStack的安全组规则通过iptables的规则链实现。每条安全组规则会被转换为相应的i…

通义万相2.1 图生视频:为AI绘梦插上翅膀,开启ALGC算力领域新纪元

通义万相2.1图生视频大模型 通义万相2.1图生视频技术架构万相2.1的功能特点性能优势与其他工具的集成方案 蓝耘平台部署万相2.1核心目标典型应用场景未来发展方向 通义万相2.1ALGC实战应用操作说明功能测试 为什么选择蓝耘智算蓝耘智算平台的优势如何通过API调用万相2.1 写在最…

52.个人健康管理系统小程序(基于springbootvue)

目录 1.系统的受众说明 2.开发环境与技术 2.1 MYSQL数据库 2.2 Java语言 2.3 微信小程序技术 2.4 SpringBoot框架 2.5 B/S架构 2.6 Tomcat 介绍 2.7 HTML简介 2.8 MyEclipse开发工具 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作…

学习比较JVM篇(六):解读GC日志

一、前言 在之前的文章中&#xff0c;我们对JVM的结构、垃圾回收算法、垃圾回收器做了一些列的讲解&#xff0c;同时也使用了JVM自带的命令行工具进行了实际操作。今天我们继续讲解JVM。 我们学习JVM的目的是为了了解JVM&#xff0c;然后优化对应的参数。那么如何了解JVM运行…

I²S协议概述与信号线说明

IIS协议概述 ​ IS&#xff08;Inter-IC Sound&#xff09;协议&#xff0c;又称 IIS&#xff08;Inter-IC Sound&#xff09;&#xff0c;是一种专门用于数字音频数据传输的串行总线标准&#xff0c;由飞利浦&#xff08;Philips&#xff09;公司提出。该协议通常用于微控制器…

免费Deepseek-v3接口实现Browser-Use Web UI:浏览器自动化本地模拟抓取数据实录

源码 https://github.com/browser-use/web-ui 我们按照官方教程&#xff0c;修订几个环节&#xff0c;更快地部署 步骤 1&#xff1a;克隆存储库 git clone https://github.com/browser-use/web-ui.git cd web-ui Step 2: Set Up Python Environment 第 2 步&#xff1a;设置…

[蓝桥杯] 求和

题目链接 P8772 [蓝桥杯 2022 省 A] 求和 - 洛谷 题目理解 这道题就是公式题&#xff0c;我们模拟出公式后&#xff0c;输出最终结果即可。 本题不难&#xff0c;相信很多同学第一次见到这道题都是直接暴力解题。 两个for循环&#xff0c;测试样例&#xff0c;直接拿下。 #in…

通过Ollama本地部署DeepSeek R1模型(Windows版)

嗨&#xff0c;大家好&#xff0c;我是心海 以下是一份详细的Windows系统下通过Ollama本地部署DeepSeek R1模型的教程&#xff0c;内容简洁易懂&#xff0c;适合新手用户参考 本地部署大模型&#xff0c;就有点像在你自己的电脑或者服务器上&#xff0c;安装并运行这样一个“私…

【C++】vector的底层封装和实现

目录 目录前言基本框架迭代器容量第一个测试&#xff0c;野指针异常第二轮测试&#xff0c;浅拷贝的问题 元素访问修改操作push_backinsert迭代器失效问题 erase 默认成员函数构造函数双重构造引发调用歧义 拷贝构造赋值重载析构函数 源码end 目录 前言 废话不多说&#xff0…

Open CASCADE学习|读取点集拟合样条曲线(续)

问题 上一篇文章已经实现了样条曲线拟合&#xff0c;但是仍存在问题&#xff0c;Tolerance过大拟合成直线了&#xff0c;Tolerance过大头尾波浪形。 正确改进方案 1️⃣ 核心参数优化 通过调整以下参数控制曲线平滑度&#xff1a; Standard_Integer DegMin 3; // 最低阶…

【Django】教程-11-ajax弹窗实现增删改查

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…

R语言:气象水文领域的数据分析与绘图利器

R 语言是一门由统计学家开发的用于统计计算和作图的语言&#xff08;a Statistic Language developed for Statistic by Statistician&#xff09;&#xff0c;由 S 语言发展而来&#xff0c;以统计分析功能见长。R 软件是一款集成 了数据操作、统计和可视化功能的优秀的开源软…

Kotlin与HttpClient编写视频爬虫

想用Apache HttpClient库和Kotlin语言写一个视频爬虫。首先&#xff0c;我需要确定用户的具体需求。视频爬虫通常涉及发送HTTP请求&#xff0c;解析网页内容&#xff0c;提取视频链接&#xff0c;然后下载视频。可能需要处理不同的网站结构&#xff0c;甚至可能需要处理动态加载…

图形化编程语言:低代码赛道的技术革命与范式突破

在 2024 年 Gartner 低代码平台魔力象限报告中&#xff0c;传统低代码厂商市场份额增速放缓至 12%&#xff0c;而图形化编程语言赛道融资额同比激增 370%。本文深度剖析低代码平台的技术瓶颈&#xff0c;系统阐释图形化编程语言的核心优势&#xff0c;揭示其如何重构软件开发范…