scala学习七:集合

一、集合colletion

Scala提供了一套很好的集合实现,提供了一些集合类型的抽象。
Scala 集合分为可变的和不可变的集合。

可变集合可以在适当的地方被更新或扩展。可以修改,添加,移除一个集合的元素。
而不可变集合类,永远不会改变。不过,仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。

几种常用集合类型的应用:

序号集合是否可变
1List(列表) List的特征是其元素以线性方式存储,集合中可以存放重复对象。不可变
2Set(集合) Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。默认不可变
3Map(映射) 把键对象和值对象映射的集合默认不可变
4Tuple(元组) 不同类型的值的集合不可变
5Option Option[T] 表示有可能包含值的容器,也可能不包含值。
6Iterator(迭代器) 不是容器,更确切的说是逐一访问容器内元素的方法。

1 List

列表类似于数组,它们所有元素的类型都相同,但是它们也有所不同:列表是不可变的,值一旦被定义了就不能改变,其次列表 具有递归的结构(也就是链接表结构)而数组不是。
构造列表的两个基本单位是 Nil ::
Nil 也可以表示为一个空列表。

  def myList(): Unit = {// 空列表val empty: List[Nothing] = List()                           val empty = Nilval website: List[String] = List("chrome", "mooc", "w3c")  // 必须有Nil,不然::报错val user = "Anna" :: ("Sarah"::Nil)val info = website ::: useruser.foreach(print)println()info.foreach(println)// 二维列表val dim: List[List[Int]] =List(List(1, 0, 0),List(0, 1, 0),List(0, 0, 1))}AnnaSarah
chrome
mooc
w3c
Anna
Sarah

1.1 列表基本操作

Scala列表有三个基本操作:
head 返回列表第一个元素
tail 返回一个列表,包含除了第一元素之外的其他元素
isEmpty 在列表为空时返回true

// info chrome,mooc,w3c,Anna,Sarah
myListFunc(info)
def myListFunc(testList:List[String]): Unit = {println(testList.head)println(testList.tail)print(testList.isEmpty)
}chrome
List(mooc, w3c, Anna, Sarah)
false

1.2 列表连接

:::
concat

1.3 List.fill()

创建指定重复数量的元素列表

def myListFill(): Unit = {val site = List.fill(3)("chrome")val num = List.fill(10)(2)println("site: " + site)println("num: " + num)
}
site: List(chrome, chrome, chrome)
num: List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)

1.4 List.tabulate()

List.tabulate() 通过给定的函数创建列表

  def testListTabulate(): Unit = {val squares = List.tabulate(6)(n => n * n)println("一维: ",squares)val matrix = List.tabulate(4, 5)( _ * _ + 3)println("多维: ", matrix)
(一维: ,List(0, 1, 4, 9, 16, 25))
(多维: ,List(List(3, 3, 3, 3, 3), List(3, 4, 5, 6, 7), List(3, 5, 7, 9, 11), List(3, 6, 9, 12, 15)))

1.5 List.reverse

//info List(chrome, mooc, w3c, Anna, Sarah)
println(info.reverse)
List(Sarah, Anna, w3c, mooc, chrome)

2. Set

没有重复的对象集合,所有的元素都是唯一的
默认情况下,Scala 使用的是不可变集合,如果想使用可变集合,需要引用 scala.collection.mutable.Set 包

val set = Set(1, 2, 3, 5)
println(set.getClass.getName) // scala.collection.immutable.Set$Set4println(set.exists(_ % 2 == 0)) //true 里面有元素整除2
println(set.drop(2)) //Set(3, 5)   删除前N个元素

如果想要用可变集合,就用 scala.collection.mutable.Set 包,使用toSet可以转为不可变

 def main(args: Array[String]): Unit = {val mutableSet = Set(1, 2, 3, 5)println(mutableSet.getClass.getName) // scala.collection.mutable.HashSetmutableSet.add(4)     // 增加一项 Set(1, 5, 2, 3, 4)mutableSet.remove(2)  // 删除元素 2mutableSet += 6       // 增加元素6 Set(1, 5, 6, 3, 4)mutableSet -= 3       // 删除元素3 Set(1, 5, 6, 4)val another = mutableSet.toSetprintln(another.getClass.getName) // scala.collection.immutable.Set 不可变}

注意: 虽然可变Set和不可变Set都有添加或删除元素的操作,但是有一个非常大的差别。
对不可变Set进行操作,会产生一个新的set,原来的set并没有改变,这与List一样。
对可变Set进行操作,改变的是该Set本身,与ListBuffer类似。

2.1 集合基本操作

Scala集合有三个基本操作:
head 返回集合第一个元素
tail 返回一个集合,包含除了第一元素之外的其他元素
isEmpty 在集合为空时返回true

2.2 连接集合

++或者Set.++() 方法实现

def testSet()= {val site1 = Set("Edge", "Google", "Baidu") //scala.collection.immutable.Set$Set3val site2 = Set("Baidu", "Taobao")// ++ 作为运算符使用var site = site1 ++ site2println("site1 ++ site2 : " + site)//  ++ 作为方法使用site = site1.++(site2)println("site1.++(site2) : " + site)
}
site1 ++ site2 : Set(Edge, Google, Baidu, Taobao)
site1.++(site2) : Set(Edge, Google, Baidu, Taobao)

2.3 查找集合中最大与最小元素

Set.min 方法查找集合中的最小元素,使用 Set.max 方法查找集合中的最大元素

def testSet()= {val num = Set(5, 6, 90, 20, 30, 45)// 查找集合中最大与最小元素println("Set(5,6,90,20,30,45) 集合中的最小元素是 : " + num.min)println("Set(5,6,90,20,30,45) 集合中的最大元素是 : " + num.max)
}Set(5, 6, 90, 20, 30, 45) 集合中的最小元素是: 5
Set(5, 6, 90, 20, 30, 45) 集合中的最大元素是: 90

2.4 交集

使用 Set.& 方法或 Set.intersect 方法来查看两个集合的交集元素

def testSet()= {val num1 = Set(5, 6, 9, 20, 30, 45)     val num2 = Set(50, 60, 9, 20, 35, 55)   // 交集println("num1.&(num2) : " + num1.&(num2))  // Set(20, 9)println("num1.intersect(num2) : " + num1.intersect(num2)) // Set(20, 9)
}

3 Map

可迭代的键值对(key/value)结构。Map里面的值通过键来获取。Map 中的键都是唯一的。
Map 也叫哈希表(Hash tables)
Map 有两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以。
默认情况下 Scala 使用不可变 Map。如果需要使用可变集合,需要显式的引入 import scala.collection.mutable.Map 类
在 Scala 中 可以同时使用可变与不可变 Map,不可变的直接使用 Map,可变的使用 mutable.Map。

//不可变Map
// 空哈希表,键为字符串,值为整型
var A: Map[Char, Int] = Map()
// Map 键值对演示
var colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF") // Map(red -> #FF0000, azure -> #F0FFFF)
colors += ("yellow" -> "#F000FF") // Map(red -> #FF0000, azure -> #F0FFFF, yellow -> #F000FF)
// Map基本操作
println(colors.keys)     // Set(red, azure, yellow)
println(colors.values)   // MapLike(#FF0000, #F0FFFF, #F000FF)
println(colors.isEmpty)  // false

3.1 Map 基本操作

keys 返回 Map 所有的键(key)
values 返回 Map 所有的值(value)
isEmpty 在 Map 为空时返回true

3.2 Map合并

++或者Map.++()实现。

3.3 查看 Map 中是否存在指定的 Key

Map.contains

def main(args: Array[String]): Unit = {// Map 键值对演示var colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF") // Map(red -> #FF0000, azure -> #F0FFFF)colors += ("yellow" -> "#F000FF") // Map(red -> #FF0000, azure -> #F0FFFF, yellow -> #F000FF)if(colors.contains("red")){println(s"color red exists, value is", colors("red"))}else{println("color red not exists")}if (colors.contains("blue")) {println(s"color blue exists, value is", colors("blue"))} else {println("color blue not exists")}
}(color red exists, value is,#FF0000)
color blue not exists

4 Tuple

元组是不可变的,但与列表不同的是元组可以包含不同类型的元素。

def main(args: Array[String]): Unit = {val t = (1, 3.14, "Fred")println(t.getClass.getName) //scala.Tuple3val test = (1, 3.14, "Fred", 'a', 5.6, "scala", 'b', 2, 8, 9, 10, 12, 15, 18, "Fri", "Dec", 'c', 'd', 1.23, 4.56, 8.91, 99, "python", "test") // too many elements for tuple: 24, allowed: 22
}

元组的实际类型取决于它的元素的类型,目前 Scala 支持的元组最大长度为 22。对于更大长度你可以使用集合,或者扩展元组。

4.1 迭代元组

Tuple.productIterator()

def main(args: Array[String]): Unit = {val t = (1, 3.14, "Fred", 'a', 5.6)t.productIterator.foreach{i => println(i)}
}

4.2 元组转为字符串

Tuple.toString() 将元组的所有元素组合成一个字符串

4.3 元组交换元素

swap 交换元组的元素,仅限于元组内只有两个元素

def main(args: Array[String]): Unit = {val t = (1, 3.14, "Fred", 'a', 5.6, 1)val t2 = (1,2)val tString = t.toString()println(t.getClass.getName, tString.length, tString(0), tString) // (scala.Tuple5,19,(,(1,3.14,Fred,a,5.6))val tSwap = t2.swapprintln(tSwap) // (2,1)
}

5 Option

Scala Option(选项)类型用来表示一个值是可选的(有值或无值)。
Option[T] 是一个类型为 T 的可选值的容器: 如果值存在, Option[T] 就是一个 Some[T] ,如果不存在, Option[T] 就是对象 None 。

def main(args: Array[String]): Unit = {val myMap: Map[String, String] = Map("key1" -> "value")val value1: Option[String] = myMap.get("key1")val value2: Option[String] = myMap.get("key2")println(value1)  // Some(value)println(value1.getOrElse().getClass.getName) // java.lang.Stringprintln(value2)  // Noneprintln(value2.getOrElse().getClass.getName) // scala.runtime.BoxedUnit
}

也可以通过模式匹配来输出匹配值

def main(args: Array[String]): Unit = {val sites = Map("baidu" -> "www.baidu.com", "google" -> "www.google.com")println("show(sites.get( \"baidu\")) : " +show(sites.get("baidu")))println("show(sites.get( \"UC\")) : " +show(sites.get("UC")))
}def show(x: Option[String]) = x match {case Some(s) => scase None => "?"
}

在这里插入图片描述

5.1 getOrElse() 方法

使用 getOrElse() 方法来获取元组中存在的元素或者使用其默认的值

def main(args: Array[String]): Unit = {val a: Option[Int] = Some(5)val b: Option[Int] = Noneprintln("a.getOrElse(0): " + a.getOrElse(0))   // a.getOrElse(0): 5println("b.getOrElse(10): " + b.getOrElse(10)) // b.getOrElse(10): 10    println("a.isEmpty: " + a.isEmpty)   // a.isEmpty: falseprintln("b.isEmpty: " + b.isEmpty)   // b.isEmpty: true
}

5.2 isEmpty() 方法

使用 isEmpty() 方法检测元组中的元素是否为 None

6. Iterator

6.1 Iterator

iterator 是一种用于访问集合的方法。
迭代器 it 的两个基本操作是 next 和 hasNext。
调用 it.next()会返回迭代器的下一个元素,并且更新迭代器的状态。
调用 it.hasNext()用于检测集合中是否还有元素。

  def main(args: Array[String]): Unit = {val it = Iterator("Baidu", "Google", "Runoob", "Taobao")while (it.hasNext) {println(it.next())}}Baidu
Google
Runoob
Taobao

6.2 查找最大与最小元素

最大值 it.max
最小值 it.min

def main(args: Array[String]): Unit = {val ita = Iterator(20,40,2,50,69, 90)val itb = Iterator(20,40,2,50,69, 90)println("最大元素是:" + ita.max )println("最小元素是:" + itb.min )
}最大元素是:90
最小元素是:2

6.3 获取迭代器的长度

可以使用 it.sizeit.length 方法来查看迭代器中的元素个数

def main(args: Array[String]): Unit = {val ita = Iterator(20,40,2,50,69, 90)val itb = Iterator(20,40,2,50,69, 90)println("ita.size的值:" + ita.size )println("itb的长度:" + itb.length )
}

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

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

相关文章

【操作系统】探究进程奥秘:显示进程列表的解密与实战

​🌈个人主页:Sarapines Programmer🔥 系列专栏:Linux专栏:《探秘Linux | 操作系统解密》⏰诗赋清音:月悬苍穹泛清辉,梦随星河徜徉辉。情牵天际云千层,志立乘风意自飞。 ​ 目录 &a…

Go_defer详解

defer 1. 前言 defer语句用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行。 为了方便描述,我们把创建defer的函数称为主函数,defer语句后面的函数称为延迟函数。 延迟函数可能有输入…

IDEA 2022.2 安装教程

1.下载2020.3版本IDEA 链接:https://pan.baidu.com/s/1IFK8VRjT7vM2VM75ToveGQ?pwd176m 提取码:176m 2.安装 下载完成后,双击exe安装包,出现IDEA安装欢迎首页: 3.将 ja - netfiltet 文件复制到idea安装目录附件 …

Docker部署Nexus Maven私服并实现远程访问Nexus界面

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定N…

【ONE·MySQL || 基础介绍】

总言 主要内容:MySQL在Centos 7下的安装(主要学习相关指令语句,理解安装操作是在做什么)、对MySQL数据库有一个基础认识。 文章目录 总言0、MySQL的安装与卸载(Centos 7)0.1、MySQL的卸载0.1.1、卸载不必要…

面向对象设计与分析40讲(15)简单工厂方法模式

文章目录 定义示例优缺点定义 简单工厂模式是一种创建型模式,用于根据客户端的需求创建对象实例,所谓的需求反映到编程语言里就是传入的参数。 简单工厂模式包括三个主要部分: 工厂类(Simple Factory):这是整个模式的核心。它负责根据客户端的请求来创建并返回相应的对…

.Net7.0 或更高版本 System.Drawing.Common 上传图片跨平台方案

项目升级.Net7.0以后,System.Drawing.Common开关已经被删除,且System.Drawing.Common仅在 Windows 上支持 ,于是想办法将原来上传图片验证文件名和获取图片扩展名方法替换一下,便开始搜索相关解决方案。 .Net6.0文档:…

Java Web基础详解

回顾 之前的两篇的文章已经大概的带我们了解了tomcat的一些基本的操作,比如从零搭建我们自己的调试环境以及官方文档构建的方式,接下来的话,我将带大家来了解一下tomcat的一些基础知识,这些基础知识将以问题的方式抛出&#xff0…

移动开发新的风口?Harmony4.0鸿蒙应用开发基础+实践案例

前段时间鸿蒙4.0引发了很多讨论,不少业内人士认为,鸿蒙将与iOS、安卓鼎足而三了。 事实上,从如今手机操作系统竞赛中不难看出,安卓与iOS的形态、功能逐渐趋同化,两大系统互相取长补短,综合性能等差距越来越…

索引进阶 | 再谈 MySQL 的慢 SQL 优化

索引可以提高数据检索的效率,降低数据库的IO成本。 MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的。 MySQL提供了Explain,用于显示SQL执行的详细信息,可以…

《Git快速入门》Git分支

1.master、origin、origin/master 区别 首先搞懂git分支的一些名称区别: master : Git 的默认分支名字。它并不是一个特殊分支、跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它&#xff0c…

iOS设备信息详解

文章目录 ID 体系iOS设备信息详解IDFA介绍特点IDFA新政前世今生获取方式 IDFV介绍获取方式 UUID介绍特点获取方式 UDID介绍获取方式 OpenUDID介绍 Bundle ID介绍分类其他 IP地址介绍获取方式 MAC地址介绍获取方式正常获取MAC地址获取对应Wi-Fi的MAC地址 系统版本获取方式 设备型…

什么是OAuth2.0

前言 OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数…

智能优化算法应用:基于蛇优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蛇优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蛇优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蛇优化算法4.实验参数设定5.算法结果6.参考文…

Zookeeper-应用实战

Zookeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。 ZooKeeper官方的Java客户端API。 第三方的Java客户端API,比如Curator。 ZooKeeper官方的客户端API提供了基本的操作:创建会话、创建节点、读取节点、更新数据、…

AI赋能金融创新:ChatGPT引领量化交易新时代

文章目录 一、引言二、ChatGPT与量化交易的融合三、实践应用:ChatGPT在量化交易中的成功案例四、挑战与前景五、结论《AI时代Python量化交易实战:ChatGPT让量化交易插上翅膀》📚→ [当当](http://product.dangdang.com/29658180.html) | [京东…

深入了解 Android 中的应用程序签名

深入了解 Android 中的应用程序签名 一、应用程序签名介绍1.1 应用程序签名1.2 应用程序签名的意义1.3 应用程序签名的流程1.4 应用程序签名的方案1.5 签名的重要性和应用场景 二、AOSP 的应用签名2.1 AOSP的应用签名文件路径2.2 应用程序指定签名文件 三、Android Studio 的应…

Python遥感影像深度学习指南(1)-使用卷积神经网络(CNN、U-Net)和 FastAI进行简单云层检测

【遥感影像深度学习】系列的第一章,Python遥感影像深度学习的入门课程,介绍如何使用卷积神经网络(CNN)从卫星图像中分割云层 1、数据集 在本项目中,我们将使用 Kaggle 提供的 38-Cloud Segmentation in Satellite Images数据集。 该数据集由裁剪成 384x384 (适用…

【csapp】cachelab

文章目录 Part APart B32 * 3264 * 6461 * 67 实验全程参考大佬的博客CS:APP3e 深入理解计算机系统_3e CacheLab实验 ,感觉大佬在矩阵转置那块介绍的还是有些简略,我自己又做了点动图加以补充理解。膜拜大佬! Part A 先解决解析命令行参数的…

jsonhandle 插件下载

网盘地址: 链接:https://pan.baidu.com/s/1hj4GKuGNyDNP2JzsJTLFtg 提取码:87rw 1.打开谷歌浏览器,选择扩展程序,记得选择为开发者模式,然后把下载好的CRX文件拖进去就行了