Scala 数据结构-集合

news2024/9/20 16:38:43

文章目录

  • Scala 数据结构-集合
    • 一、集合简介
      • 1、不可变集合继承图
      • 2、可变集合继承图
    • 二、数组
      • 1、不可变数组
        • (1) 创建数组
        • (2) 访问数组
        • (3) 遍历数组
        • (4) 添加元素

Scala 数据结构-集合

一、集合简介

1)Scala的集合有三大类:序列seq,集合Set,映射Map,所有的集合都扩展自Iterable特质.
2)对于几乎所有的集合类,Scala都同时提供了可变不可变的版本,分别位于以下两个包
不可变集合:scala.collection.immutable
可变集合:scala.collection.mutable
3)Scala不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而不会对原对象进行修改,类似于java中的String对象
4)可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象,类似于java中的StringBuilder对象
小窍门建议在操作集合的时候,不可变用符号,可变用方法

1、不可变集合继承图

seq 序列相当于替代的是Java里面的list 列表
1)SetMap是Java中也有的集合
2)Seq是Java中没有的,我们发现List归属到Seq了,因此这里的List就和Java不是同一个概念了
在这里插入图片描述

2、可变集合继承图

在这里插入图片描述

二、数组

1、不可变数组

(1) 创建数组

1)第一种方式定义数组
定义:val arr1 = new Array[Int](10)
(1) new 是关键字
(2) [Int] 是指可以存放的数据类型,如果希望存放任意数据类型,则指定Any []里面是泛型,只是Java里的是<>
(3) (10),表示数组的大小,确定后就不可以变化
2)第二种创建数组方式
val arr2 = Array(12,21,23,66,97) //可以直接创建的时候赋值,我比较喜欢这种,其实是Array.apply() 但是apply可以省略
3) 案例示例
这下面说了两种创建数组的方式,第一种是使用泛型,创建的时候,没有赋值,所有的元素都为0,第二种是使用了apply方法,我更喜欢第二种。可以创建的时候直接赋值

package Scala03_shujujiegou
//不可变数组
class test01_bukebian {

}
object test01_bukebian{
  def main(args: Array[String]): Unit = {
    //1、创建一个不可变的数组
    val arr1:Array[Int] = new Array[Int](10)  //创建一个大小为10,长度为10的数组
    //2、另一种创建方式 这种方式比较棒
    val arr2 = Array(5,12,46,58,97)  //可以通过Array.apply(12)方法创建,然后apply可以省略,创建了长度为5的数组
    
  }
}

(2) 访问数组

访问是arr1(0) 括号里面是索引,是() 不是 [],可以对属性值进行修改,但是不可变数组的添加和删除操作做不了

package Scala03_shujujiegou
//不可变数组
class test01_bukebian {

}
object test01_bukebian{
  def main(args: Array[String]): Unit = {
    //1、创建一个不可变的数组
    val arr1:Array[Int] = new Array[Int](10)  //创建一个大小为10,长度为10的数组
    //2、另一种创建方式 这种方式比较棒
    val arr2 = Array(5,12,46,58,97)  //可以通过Array.apply(12)方法创建,然后apply可以省略,创建了长度为5的数组
    println(arr2.apply(1))
    println(arr1.apply(2))

    //3、访问方式  删除数据和插入数据对于不可变数组是做不到的,但是对于改变某个位置上的值是可以做到的
    println(arr1(0)) //访问很简单。直接arr() 里面是索引 是()不是[]
    println(arr2(0))
    //println(arr1(10)) //这里为10的话那么就越界了

    arr1(0) = 12  //赋值也是按照访问的方式,然后进行赋值,再进行访问就可以了
    arr1(4) = 97
    println(arr1(0))
    println(arr1(4))

  }
}

(3) 遍历数组

因为数组只有五个值,一个一个进行访问还是比较简单,但是要是有500个数,不可能一行一行的500行代码,所以要遍历数组
总结: 这些遍历的方法不只是数组可以用,其他的数据类型也可以用
下面一共五个遍历数组的方法:
1、普通for循环
for(i <- 0 until arr.length){ println(arr(i)) }
2、增强for循环,不遍历索引,只遍历元素
for(i <- arr){ println(i) }
3、迭代器 一般使用while循环,就两个方法,判断写一个元素存不存在,存在就输出下一个元素
val iter = arr.iterator while(iter.hasNext){ println(iter.next) }
4、forEach 方法
arr.forEach((i:Int)=>println(i)) //这个里面的参数是一个函数
arr.forEach(println) //可以简化成直接println,里面参数
5、mkString 将数组里的元素连在一起输出,这个也非常好用,对应的是python里的join
arr.mkString(",")

package Scala03_shujujiegou
//不可变数组
class test01_bukebian {

}
object test01_bukebian{
  def main(args: Array[String]): Unit = {
    //1、创建一个不可变的数组
    val arr1:Array[Int] = new Array[Int](10)  //创建一个大小为10,长度为10的数组
    //2、另一种创建方式 这种方式比较棒
    val arr2 = Array(5,12,46,58,97)  //可以通过Array.apply(12)方法创建,然后apply可以省略,创建了长度为5的数组
    println(arr2.apply(1))
    println(arr1.apply(2))

    //3、访问方式  删除数据和插入数据对于不可变数组是做不到的,但是对于改变某个位置上的值是可以做到的
    println(arr1(0)) //访问很简单。直接arr() 里面是索引 是()不是[]
    println(arr2(0))
    //println(arr1(10)) //这里为10的话那么就越界了

    arr1(0) = 12  //赋值也是按照访问的方式,然后进行赋值,再进行访问就可以了
    arr1(4) = 97
    println(arr1(0))
    println(arr1(4))
    println("====================")

    //4、数组的遍历
    // 1) 普通for循环
    //报黄说明不是最简单的实现方式,但是我比较喜欢这种
    for(i <- 1 until  arr2.length){ //scala里面用until 就可以不用数组-1了
      println(arr2(i))
    }
    println("==================")
    for(i <- arr2.indices){
      println(arr2(i))
    }
    println("=================")

    //2) 增强for循环
    //其实访问一个集合里面的元素,没有必要非要去遍历他的索引,我们根本不去考虑索引,只是想要将所有的数据打印输出
    //直接遍历所有元素,增强for循环
    for(i <- arr2){ //直接从数组里面拿数,就不用索引了
      println(i)

    }

    println("=============")
    //3)迭代器
    val iter = arr2.iterator //定义一个迭代器,数组.iterator方法
    while (iter.hasNext){  //一般迭代器使用while循环,因为就两个方法,如果存在,就输出下一个
      println(iter.next())
    }
    println("=============")

    //4) 调用forEach方法 跟增强for循环完全等价,都是直接输出的元素
    //所有的集合类型都可以调forEach方法,只不过具体的实现,可能略有不同
    arr2.foreach((i:Int) => println(i)) //他这里面的参数应该是一个函数,然后我写的lamdam表达式,i int类型,然后要做的操作是输出元素
    arr2.foreach(println) //可以简化成直接一个println ,因为数组是Int类型那系统可以自己推断,然后变量i可以用_代替
    //5) mkString 方法,将所有数连在一起输出,这个也很方便
    println(arr2.mkString(",")) //要是想把所有数连在一起输出,使用mkString方法


  }
}

(4) 添加元素

因为不可变数组是不可以直接添加元素的,所以我们赋值个一个新的变量对象,然后就可以进行修改了,然后调用这个新的数组
有两种方式: 推荐第二个方法
第一种
val arr3 = arr2.:+(13) //这样是加在原数组的后面
val arr3 = arr2.+:(14) //吧.+: 这个+和:反过来就是在前面加
第二种
var arr4 = 66 +: 12+: arr2 :+ 14 :+ 13 // + 在前面的就是加在数组的前面,+在后面的就是加在数组的后面,就非常直观了,不容易搞错,而且还可以一次性添加多个

package Scala03_shujujiegou
//不可变数组
class test01_bukebian {

}
object test01_bukebian{
  def main(args: Array[String]): Unit = {
    //1、创建一个不可变的数组
    val arr1:Array[Int] = new Array[Int](10)  //创建一个大小为10,长度为10的数组
    //2、另一种创建方式 这种方式比较棒
    val arr2 = Array(5,12,46,58,97)  //可以通过Array.apply(12)方法创建,然后apply可以省略,创建了长度为5的数组
    println(arr2.apply(1))
    println(arr1.apply(2))

    //3、访问方式  删除数据和插入数据对于不可变数组是做不到的,但是对于改变某个位置上的值是可以做到的
    println(arr1(0)) //访问很简单。直接arr() 里面是索引 是()不是[]
    println(arr2(0))
    //println(arr1(10)) //这里为10的话那么就越界了

    arr1(0) = 12  //赋值也是按照访问的方式,然后进行赋值,再进行访问就可以了
    arr1(4) = 97
    println(arr1(0))
    println(arr1(4))
    println("====================")

    //4、数组的遍历
    // 1) 普通for循环
    //报黄说明不是最简单的实现方式,但是我比较喜欢这种
    for(i <- 1 until  arr2.length){ //scala里面用until 就可以不用数组-1了
      println(arr2(i))
    }
    println("==================")
    for(i <- arr2.indices){
      println(arr2(i))
    }
    println("=================")

    //2) 增强for循环
    //其实访问一个集合里面的元素,没有必要非要去遍历他的索引,我们根本不去考虑索引,只是想要将所有的数据打印输出
    //直接遍历所有元素,增强for循环
    for(i <- arr2){ //直接从数组里面拿数,就不用索引了
      println(i)

    }

    println("=============")
    //3)迭代器
    val iter = arr2.iterator //定义一个迭代器,数组.iterator方法
    while (iter.hasNext){  //一般迭代器使用while循环,因为就两个方法,如果存在,就输出下一个
      println(iter.next())
    }
    println("=============")

    //4) 调用forEach方法 跟增强for循环完全等价,都是直接输出的元素
    //所有的集合类型都可以调forEach方法,只不过具体的实现,可能略有不同
    arr2.foreach((i:Int) => println(i)) //他这里面的参数应该是一个函数,然后我写的lamdam表达式,i int类型,然后要做的操作是输出元素
    arr2.foreach(println) //可以简化成直接一个println ,因为数组是Int类型那系统可以自己推断,然后变量i可以用_代替
    //5) mkString 方法,将所有数连在一起输出,这个也很方便
    println(arr2.mkString(",")) //要是想把所有数连在一起输出,使用mkString方法

    println("===========")

    //添加元素
    //因为不可变数据是不可以添加数据的
    //我们说的不是直接在当前数组上直接改变这个数组,而是说添加元素之后,我们再把它作为一个新的数组返回
    val arr3 = arr2.:+(17) //.:+() 然后里面是要添加的元素 直接调用的话还是原来的数组,因为不可变数组是不可以改变的,我们把他创建一个新的对象
    println(arr3.mkString(",")) //赋值给新的变量,就可以看到添加成功了

    //不只是可以在最后面进行添加,也可以在前面进行添加
    val arr4 = arr2.+:(18) //把.:+ 改为 .+: 就成在前面添加元素了
    println(arr4.mkString(","))
    arr4.foreach(println)

    println("===============")
    //这个样子看不懂的话,下面这种比较棒 这个有点像链表的那种添加
    val arr5 = 13 +: 12 +: arr2 :+ 15 //这个样子+:然后数字写在前面就是在前面加 :+ 这样就是在后面加
    println(arr5.mkString(","))


  }
}

在这里插入图片描述

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

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

相关文章

解决fstab丢失,重启系统变为只读模式

现象描述&#xff1a; 背景&#xff1a;openEuler20.03 在/etc/fstab文件丢失、重启系统后&#xff0c;系统变为只读模式 [rootlocalhost ~]# echo 111 > 1.txt -bash: 1.txt: Read-only file system 解决方法&#xff1a; 查看系统信息&#xff0c;确认挂载信息&#…

【C进阶】数据在内存中的存储

数据在内存中的存储前言一、数据类型介绍&#xff08;一&#xff09;基本概念&#xff08;二&#xff09;类型的基本归类1.整型家族2.浮点型家族3.构造类型4.指针类型5.空类型二、整形在内存中的存储&#xff08;一&#xff09;原码、反码、补码1.概念2.为什么内存中存的是补码…

android input 事件分发 --- 注册input

android input 事件分发 --- 注册input应用注册input事件应用注册input事件 应用如果要监听input的事件&#xff0c;那么肯定就存在一个注册监听input事件的过程&#xff0c;跟随着addView方法我们跟着走一下frameworks/base/core/java/android/view/WindowManagerImpl.java Ov…

Centos7 安装 MongoDB

使用docker安装Mongo 1、拉取镜像 注&#xff1a;需要科学上网 docker pull mongo [rootlocalhost ~]# docker pull mongo Using default tag: latest latest: Pulling from library/mongo 846c0b181fff: Pull complete ef773e84b43a: Pull complete 2bfad1efb664: Pull co…

LeetCode:14. 最长公共前缀

14. 最长公共前缀1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果1&#xff09;题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs [“flo…

python常用快捷键

一、编辑&#xff08;Editing&#xff09;Ctrl Space 基本的代码完成&#xff08;类、方法、属性&#xff09;Ctrl Alt Space 快速导入任意类Ctrl Shift Enter 语句完成Ctrl P 参数信息&#xff08;在方法中调用参数&#xff09;Ctrl Q 快速查看文档F1 外部文档Shift F…

c语言 通讯录 动态内存开辟

通讯录 通讯录中能够存放1000人信息 每个人信息&#xff1a; 姓名年龄性别电话地址 2.增加人的信息 3.删除指定人的信息 4修改指定人的信息 5.查找指定人的信息 6.排序通讯录的信息 contact.h 放头文件的声明 tset.c 测试通讯录模块 contact.c 函数的实现 test.c #include &…

基于不同操作系统升级知行之桥的常见问题

此前的文章知行之桥2022版本升级之页面变化以及监控邮件答疑给大家分享了一些升级到知行之桥最新版本关于Web页面显示和监控邮件的一些问题&#xff0c;本篇将分享一些windows和Linux不同操作系统升级部署知行之桥最新版本的一些Q&A。 EDI服务器是windows服务器 Windows操…

Smart JavaScript UI 14.4.0 Crack【htmlelements】

Smart是一个建立在 JavaScript、HTML 和 CSS 之上的全面且创新的 UI 库。Ω578867473使开发人员能够交付专业的、跨浏览器兼容的 Web 应用程序&#xff0c;同时显着缩短他们的开发时间。Smart HTML Elements 包含 60 多个 UI 组件&#xff0c;是 Web 上发展最快的 JavaScript U…

Centos7配置阿里云yum源及epel源

Background 踩坑记录吧。下次可以直接复制粘贴&#xff0c;不用再去排查是哪个字母字符少了多了&#xff0c;我这都是执行成功的命令粘贴过来的。 1、基础知识简介 yum: 全称“Yellow dog Updater, Modified”&#xff0c;是一个专门为了解决包的依赖关系而存在的软件包管理器…

ubuntu 18.04 Pytorch安装GPU版本

先上成功的图片 过程总结&#xff1a; 之前也配置过&#xff0c;但是时间流逝&#xff0c;之前的方法也过时了&#xff08;旧方法一般会提到先装nvidia驱动&#xff0c;再cuda&#xff0c;再cudnn之类&#xff09;。 我今天尝试安装cuda 11.7时&#xff0c;发现cuda会自动安装…

使用 dict 对象创建多重索引 DataFrame

使用 dict 对象创建多重索引 DataFrame创作背景查看所需 dict 的格式结尾创作背景 本菜鸡最近碰到了需要使用字典创建多重索引 DataFrame 的场景&#xff0c;谨以本文记录解决过程。 如果觉得我这篇文章写的好的话&#xff0c;能不能给我 点个赞 &#xff0c;评论 、收藏 一条…

对近似算法概念的学习

近似算法基本概念可近似分类最小顶点覆盖问题近似算法的分析&#xff1a;多机调度问题近似算法贪心G-MPS近似算法递降贪心法DG-MPS货郎问题最近邻NN算法最小生成树法MST最小权匹配MM算法0-1背包问题贪心G-KK多项式近似方案完全多项式时间的近似方案背包问题的对偶问题总结基本概…

彻底搞懂UML图

用例图 用例图的结构主要分为三个部分&#xff1a;参与者、用例、参与者与用例之间的关系。 参与者&#xff1a;不是特指人&#xff0c;是指系统以外的&#xff0c;在使用系统或与系统交互中所扮演的角色。因此参与者可以是人&#xff0c;可以是事物&#xff0c;也可以是时间…

关于alpine如何制作JDK镜像

Docker制作jdk镜像(v1.0)1.1首先编写Dockerfile文件#1.指定基础镜像&#xff0c;并且必须是第一条指令RROM centos:7#2.指明该镜像的作者和其电子邮件MAINTAINER xnx "zwcqq.com"#3.在构建镜像时&#xff0c;指定镜像的工作目录&#xff0c;之后的命令都是基于此工作…

Python自制简易版计算器小程序

前言 今天来给你们分享一个自制的桌面小程序【简易版计算器】 文章内有效果展示&#xff0c;你们可以自行看看哦 不想看文章&#xff0c;想直接领取源码的话&#xff0c;可以直接点击文章末尾的名片哈 环境准备 Python 3.6 Pycharm 代码展示 界面设置 导入模块 所有 源码 …

STM32读取SHT3x系列温湿度传感器,标准库和HAL库

STM32读取SHT3x系列(SHT30、SHT31、SHT35)温湿度传感器的数据并显示在0.96寸OLED屏上。 我下面提供两份代码&#xff0c;一份是标准库使用硬件I2C的&#xff0c;另一份是HAL库使用软件模拟IIC的。 我用的单片机是STM32F103C8T6&#xff0c;温湿度传感器是SHT30。 STM32软件I…

Spring Cloud与Nacos部署Spring Boot项目

本文记录一个用于Spring Cloud 和nacos的一个项目配置方案 本文主要通过nacos实现了两点功能&#xff1a; 1、服务的注册与发现 2、nacos的动态配置 项目中主要包括了nacos-consumer和nacos-provider&#xff0c;一个消费者&#xff0c;一个生产者的角色&#xff0c;消费者负责…

旋转目标检测复现-yolov5-obb

复现源码&#xff1a; https://github.com/hukaixuan19970627/yolov5_obb 亲测可行 安装流程&#xff1a; 按照https://github.com/hukaixuan19970627/yolov5_obb/blob/master/docs/install.md 确保安装过程不报错&#xff0c;否则影响后续训练 安装成功即可准备数据集 hf_t…

MySQL复制技术方案——组复制

1&#xff0e;原理 增强半同步复制虽然解决了HA切换之后的幻读问题&#xff0c;也从一定程度上使得主从实例 之间的数据一致性保障得到增强&#xff0c;但是仍然还有很多问题需要解决。 例如&#xff1a; HA切换程度需要依赖于MySQL服务器之外的第三方程序实现&#xff0c;维…