Scala之集合(1)

news2024/9/21 14:53:38

目录

​​​​​​​集合介绍:

不可变集合继承图:​编辑

 可变集合继承图

数组:

不可变数组:

样例代码:

遍历集合的方法:

1.for循环

2.迭代器

3.转换成List列表:

4.使用foreach()函数:

可变数组:

ArrayBuffer:

二维数组:

 List集合:

Set 集合:

不可变 Set:

可变Set:

Map集合:

创建map:

map集合的遍历:

可变map:

元组:

tuple的定义:

元组与map的关系:

特点:

集合介绍:

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

不可变集合:

不可变集合继承图:

set集合特点:无序,不重复

对set集合无序的理解:set集合的无序是指在使用append等方法给集合添加元素的时候所添加的元素的顺序是不可预测的,并且不能按照添加顺序进行遍历(存储位置是不一定的)

Set集合的无序性是由它的实现方式所决定的。通常,Set集合的实现方式采用了哈希表这种数据结构,其中元素被散列到桶中,不同的元素可能被散列到同一个桶中,因此添加的顺序不能保证元素的顺序。

set集合提供了SortedSet集合是有序的(放入2,3,1,4会按照1,2,3,4进行存储)SortedSet写了一个TreeSet集合是树状存储

Seq Java 没有的,我们发现 List 归属到 Seq 了,因此这里的 List 就和 Java 不是同一个
概念了
我们前面的 for 循环有一个 1 to 3 ,就是 IndexedSeq 下的 Range
我们发现经典的数据结构比如 Queue(队列)  Stack (栈) 被归属到 LinearSeq( 线性序列 )
IndexedSeq LinearSeq 的区别:
1 IndexedSeq 是通过索引来查找和定位(相当于数组,通过下标查找),因此速度快,比如 String 就是一个索引集
合,通过索引即可定位
2 LinearSeq 是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找

 可变集合继承图

数组:

不可变数组:

不可变集合是长度不可变

Scala中的array 是与 Java中的[]对应

样例代码:

package chapter05
object Test01_Array {
  def main(args: Array[String]): Unit = {
    val array = new Array[Int](4)
    array(3)=100
    //遍历
    for (elem <- array) {
      println(elem)
    }
  }
}

在Scala中没有写方法名的都是调用了apply方法

遍历集合的方法:

1.for循环

        上边样例代码已经使用

2.迭代器

        迭代器相当于是指针的跳转(指针在内存中的跳转)

样例代码:

package chapter05
object Test01_Array {
  def main(args: Array[String]): Unit = {
    val array = new Array[Int](4)
    array(3)=100
val iterator: Iterator[Int] = array.iterator
    while (iterator.hasNext)
      {
        val i: Int = iterator.next()
        println(i)
      }
  }
}

3.转换成List列表:

        array集合可以通过to方法转换成List列表

4.使用foreach()函数:

在Scala中给所有的集合都提供了一个foreach()方法 进行函数式打印

foreach()源码:

def foreach[U](f: A => U): Unit = {
    var i = 0
    val len = length
    while (i < len) { f(this(i)); i += 1 }
  }

源码分析:

foreach()传入的参数实际是传入的函数

A:是代表你传入集合的类型

U:是泛型,代表你的输出类型

这个函数的返回值是Unit类型

让后通过while进行向下运行

对foreach()函数的调用使用匿名函数进行调用

  array.foreach(i=>println(i*2))

可变数组:

数组是默认的不可变的,如果需要可变是需要自己导包的

ArrayBuffer:

填入的初始化大小(数组的大小) 只决定了创建底层结构的长度(不填的话默认是16)

ArrayBuffer是可以进行添加元素的append()

可以进行增删改查

可变数组与不可变数组元素的增加区别:

可变的用方法不可变的用符号

代码样例:

可变数组的增删改查:

package chapter05
import scala.collection.mutable.ArrayBuffer
object Test_02_ArrayBuffer {
  def main(args: Array[String]): Unit = {
    //可变---导包
    val arrayBuffer = new ArrayBuffer[Int](4)
    arrayBuffer.append(1,2,3)
    arrayBuffer.remove(1)
    arrayBuffer.update(0,100)
    println(arrayBuffer(0))
    println(arrayBuffer)
  }
}

不可变数组是不可变的,如果使用符号做出改变会生成一个新的对象

val array = new Array[Int](10)
    val array1: Array[Int]= array :+ 8
    println(array1.toList)

使用to方法可以让可变与不可变数组进行相互转换

二维数组:

二维数组的定义与遍历:

   val array2: Array[ Array[Int]] = Array(Array(1, 2, 3),Array(1, 2, 3),Array(1, 2, 3))
    for (array3 <- array2) {
      for (elem <- array3) {
        print(elem+ "\t")
      }
      println()
    }

在Scala中创建多维数组的方法:

    val array3: Array[Array[Int]] = Array.ofDim[Int](3, 4)

 List集合:

List是一个抽象类 在不继承的情况下是无法new的,所以需要使用伴生对象的apply方法

直接使用即可

1 List 默认为不可变集合
2 )创建一个 List (数据有顺序,可重复)
    val list = List(1, 2, 3, 4)
3 )遍历 List
list.foreach(println)
4 List 增加数据
由继承图可知 List集合为链表下边的类  链表添加数据有头插法和尾插法之分 
        (不可变集合用符号) 
尾插:
 val ints: List[Int] = list :+ 10
 ints.foreach(println)
头插:
    val list1: List[Int] = 10 :: list
    list1.foreach(println)
5 )集合间合并:将一个整体拆成一个一个的个体,称为扁平化
扁平化是把两个集合的数据进行打散,然后进行连接合并
  val list2 = List(5, 6, 7, 8)
    val ints1: List[Int] = list ::: list2
    println(ints1)
                                   
6 )取指定数据
    println(ints1(5))
7 )空集合 Nil
      Nil是一个空集合,相当于创建一个空的List,他是一个单独的对象
val ints2: List[Int] = 1 :: 2 :: 4 :: 5 :: Nil
val ints3: List[Int] = 3 :: 6 :: 7 :: 9 :: List()

上述两行代码代表的是一个意思

ListBuffer:
ListBuffer是一个可变的集合
可变集合是可变的,调用使用函数,需要导包

Set 集合:

        默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用
scala.collection.mutable.Set
set集合其实是一个特质,需要直接调用apply方法创建对象(省略函数名)

不可变 Set:

 
1 Set 默认是不可变集合,数据无序
2 )数据不可重复(set集合的使用场景---->去重)
 val value: Any = Set(1, 1, 2,2,3, 4, 5, 6, 7, 8, 9)
    println(value)

运行结果:

判断set的类型:

 val bool: Boolean = value.isInstanceOf[HashSet[Int]]
    println(bool)
set集合默认时使用HashSet集合的,只有在数据元素的个数小于等于4个的时候才会使用特殊的set集合

可变Set:

在写可变set的时候,添加mutable.set
创建语句:
    val ints: mutable.Set[Int] = mutable.Set(1, 2, 2, 3, 1, 4, 5, 6, 8, 7, 9)

可变Set的增加是add方法,不是append方法

可变Set的集合也是符合不可重复,不可修改的特点

 只可增删查

Map集合:

map集合也是一个特质,可以通过apply方法创建对象

map是一个(k,v)集合

创建map:

(1)这是一种采用元组的方式创建的

    val map = Map(("hello", 10), ("world", 20))

(2)这是采用的箭头的方式创建的

    val map1 = Map("hello" -> 10, "world" -> 12)

常用第一种方式创建

map集合的遍历:

(采用第一种方式创建的)

for循环得到的对象是元组

    for (elem <- map) {
      //elem是元组
      val key: String = elem._1
      val value: Int = elem._2
      println(s"${key}:${value}")
    }

在Scala中value的类型为Int类型  在Java中是Int的包装类(防止在get方法找value不存在的时候为Null的情况)

上述情况也会在Scala中出现,Scala是对get方法使用Option(是一个抽象类,被两个子类实现(None,Some))封装

如果get的key存在 就调用上述的some类 再对结果进行调用get  转换成int类型 (方法很长,而且在没有值的情况下是会报错的)

因为太长引入了新的写法:

对map集合直接调用getOrElse(1)方法   设置1  有值输出值  无值输出1

    val i: Int = map.getOrElse("hello", 1)
    println(i)

不存在就会返回None

可变map:

可变map也是采用mutable.map进行创建

增删改查:

增加:

put方法  这个方法可以增加也可以进行修改   当key值存在的时候  如果value不同会覆盖前值

  val maybeInt: Option[Int] = map.put("helloi2", 23)

删除:

    val maybeInt1: Option[Int] = map.remove("hello")

查找:

查找与不可变一样使用getOrElse方法进行查找

元组:

本身为不可变 ,可以存放不同数据类型的元素

list具有上述的性质    但是使用list存放不同类型的数据 在调用的时候无法得到相应的类型(统一为Any)而tuple(元组可以)

tuple的定义:

    val tuple: (String, Int) = ("hihihi", 23)

元组与map的关系:

map中的(key  value )元素被默认当作二元组

特点:

这样我们可以实现list集合与map集合的转换

    val toList: List[(String, Int)] = map1.toList
    println(toList)

 运行结果:

 

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

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

相关文章

WebServer项目(二)->linux网络编程基础知识

WebServer项目->linux网络编程基础知识其中&#xff0c;遇到的错误总结1). read&#xff1a;Connection reset by peer2).什么叫连接被重置&#xff1f;1. socket 介绍2. 字节序从主机字节序到网络字节序的转换函数&#xff1a;htons、htonl&#xff1b; 从网络字节序到主机…

科创人·中建三局一公司尹奎:数字化变革能创造全新行业,其意义超越形式、范式创新

尹奎 中建三局一公司技术中心主任 教授级高级工程师&#xff0c;BIM领域资深专家&#xff0c;完成10余个基于BIM的相关研究课题&#xff0c;获省部级以上科技进步奖 13 项&#xff1b;公开出版专著3部&#xff0c;参与编写“十二五”国家重点图书出版规划项目《BIM应用施工》&a…

CCS5.5环境设置

CCS5.5环境设置 文件编码格式设置利用断点导入*.dat文件先用Python生成*.dat文件DSP代码&#xff08;sys/bios&#xff09; 步骤利用strip6x工具去除**.out文件中的调试信息硬件跟踪功能应用名词解释使用方法 ccs显示图片参数设置 文件编码格式设置 可分别对工作空间、工程、单…

Mysql下载安装

1.Mysql官网下载 MySQLhttps://www.mysql.com/ 有商业版和社区版&#xff0c;商业版使用收费&#xff0c;有试用期&#xff0c;社区版免费&#xff0c;选择社区版即可&#xff1a; 点击MySQL社区服务器&#xff1a; 选择要安装的版本&#xff1a; 进行下载即可&#xff1a; 2…

Docker设置http proxy代理

需求&#xff1a; 由于公司服务器无法正常访问公网&#xff0c;想要下载一些外部依赖包需要配置公司的内部代理。 Docker构建镜像或拉取镜像时需要通过代理访问外网&#xff0c;可以按照以下步骤设置HTTP代理 目录 创建目录 创建并编辑配置文件 重新加载Docker服务配置 重启…

Devops流程探究

1、DevOps面向对象 软件开发是由开发团队和运维团队共同协同配合才能完成一个软件的开发。 2、开发团队和运维团队 开发团队主要负责软件的开发和迭代更新&#xff0c;运维团队则是负责测试和部署上线。 3、解决问题 但是&#xff0c;这样会存在一个问题&#xff0c;只有当…

第五章 数据链路层与局域网

数据链路层服务 组帧&#xff1b;将要传输的数据封装成帧链路接入&#xff1b;可分为点对点链路&#xff08;独占&#xff09;和广播链路&#xff08;共享&#xff09;可靠交付&#xff1b;即在相邻节点间经数据链路实现数据报的可靠传输差错控制&#xff1b;检错纠错 差错控…

前端基础复习

1.什么叫HTML5&#xff1f;和原本的所说的HTML有什么区别&#xff1f; 本质上html和html5是一样的的。区别有&#xff1a; 1. 在文档类型声明上 HTML4.0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loos…

密码加密之bcrypt

在这里是用的bcrypt加密算法&#xff0c;这种现在比较流行 而且无法进行解密 引入依赖 <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</ar…

JetBrains AppCode 2023.1 (macOS x64、aarch64) - 适用于 iOS/macOS 开发的智能 IDE

Xcode 14.3 compatibility, Swift refactorings and intentions, the IDE’s UI, and Kotlin Multiplatform Mobile. 请访问原文链接&#xff1a;https://sysin.org/blog/jb-appcode-2023/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a…

技术分享 | OMS 初识

作者&#xff1a;高鹏 DBA&#xff0c;负责项目日常问题排查&#xff0c;广告位长期出租 。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 本文主要贡献者&#xff1a;进行OMS源码分析的…

GPT-4,大增长时代的序幕

虽然我们早在 2017 年就预测了超大模型的到来&#xff0c;因此才搞了分布式深度学习框架 OneFlow&#xff08;github.com/Oneflow-Inc/oneflow/&#xff09;&#xff0c;且 2020 年的 GPT-3 也掀起了大模型热潮&#xff08;OneFlow—— 让每一位算法工程师都有能力训练 GPT&…

BGP相关实验

实验要求及其拓扑图 划分好IP的拓扑图 实验分析 1,AS1存在两个环回&#xff0c;一个地址为192.168.1.0/24该地址不能在任何协议中宣告&#xff0c;AS3中存在两个环回&#xff0c;一个地址为192.168.2.0/24该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以互相…

30天学会《Streamlit》(4)

30学会《Streamlit》是一项编码挑战&#xff0c;旨在帮助您开始构建Streamlit应用程序。特别是&#xff0c;您将能够&#xff1a; 为构建Streamlit应用程序设置编码环境 构建您的第一个Streamlit应用程序 了解用于Streamlit应用程序的所有很棒的输入/输出小部件 第4天 - st…

【NLP】自然语言处理_NLP入门——分词和词性标注

【NLP】自然语言处理_NLP入门——分词和词性标注 文章目录 【NLP】自然语言处理_NLP入门——分词和词性标注1. 介绍2. 概念和工具2.1 分词2.2 词性标注2.3 NLTK2.4 Jieba2.5 LAC 3. 代码实现举例3.1 分词3.1.1 使用nltk进行分词3.1.2 使用jieba进行分词3.1.3 使用LAC进行分词 3…

定义全局变量property与getprop

authordaisy.skye的博客_CSDN博客-Qt,嵌入式,Linux领域博主 adb调试 adb shell getprop .adb logcat 报错 init: sys_prop: permission denied uid:1006 name:ro.camera.gc02m1 在linux驱动中查找 find ./ -name *.c | xargs grep -n "property_set" find ./ -n…

《2023金融科技·校园招聘白皮书》新鲜出炉|牛客独家

数智创新时代&#xff0c;科技人才为先。 眼下&#xff0c;在建设“数字中国”的时代背景下&#xff0c;金融行业全面数智化转型已箭在弦上。政策端&#xff0c;金融行业为中共中央、国务院印发《数字中国建设整体布局规划》的7大重点行业之一。 资本端&#xff0c;仅2022年三…

【C++ 四】函数、指针

函数、指针 文章目录 函数、指针前言1 函数1.1 概述1.2 函数定义1.3 函数调用1.4 值传递1.5 函数常见样式1.6 函数声明1.7 函数分文件编写 2 指针2.1 指针基本概念2.2 指针变量定义和使用2.3 指针所占内存空间2.4 空指针和野指针2.5 const 修饰指针2.6 指针和数组2.7 指针和函数…

Cross compiling Windows binaries from Linux

IntroductionWhy? SpeedCostContainers k8sRejected Strategies Using x86_64-pc-windows-gnuUsing wine to run the MSVC toolchainHow? Prerequisites1. Setup toolchain(s)2. Acquire Rust std lib3. Acquire CRT and Windows 10 SDK4. Override cc defaults5. ProfitBon…

机器学习 探索性数据分析

文章目录1. 数据总览1.1 查看数据的维度1.2 查看列的数据类型1.3 查看索引1.4 获取数据值1.5 数据集相关信息概览1.6 查看数据的统计信息1.7 查看前3行数据2. 缺失值查看与处理2.1 缺失值查看2.2 缺失值处理3. 异常值检测与处理3.1 异常值检测3.2 异常值处理4. 特征分析4.1 查看…