Scala从入门到放弃(三)Scala的数组、映射、元组和集合
1.数组
1.1定长数组和变长数组
object ArrayDemo {
def main(args: Array[String]): Unit = {
//初始化一个长度为8的定长数组,其数组元素均为0
val arr1 = new Array[Int](8)
//直接打印定长数组,内容为数组的hashcode值
println(arr1)
//将数组转换成数组缓冲,就可以看到原数组中的内容了
//toBuffer会将数组转成数组缓冲
println(arr1.toBuffer)
//注意:如果new ,相当于调用了数组的apply方法,直接为数组赋值
//初始化一个长度为1的定长数组
val arr2 = Array[Int](10)
println(arr2.toBuffer)
println(arr2(0)) //相当于只是填入了Array
//定义一个长度为3的定长数组
val arr3 =Array("hadoop","storm","spark")
//使用()来访问元素
println(arr3(1)) //运行结果:storm 下标从0开始
println("==================变长数组=====================")
val ab = ArrayBuffer[Int]()
//向数组缓冲的尾部追加一个元素
//+=尾部追加元素
ab+=1
//追加多个元素
ab+=(2,3,4,5)
//追加一个数组 ++=
ab ++= Array(6,7)
//追加一个数组缓冲
ab ++=ArrayBuffer(8,9)
//打印数组缓冲ab
println(ab)
//下标为 0~1之间插入 0
ab.insert(1,0,3,5,7,9) //运行结果:在下标为1的位置插入0 3 5 7 9
//删除数组某个位置的元素用remove 后面的2 为remove 下标为8 9 两个元素 游标
ab.remove(8,2)
println(ab)
}
}
运行结果

1.2 遍历数组
- 增强for循环
- 好用的until会生成脚标, 0 until 10 包含0不包含10

println("==================遍历数组=====================")
//初始化一个数组
val array1 = Array(1,2,3,4,5,6,7,8)
//增强for循环
for (i <- array1)
print(i+"\t")
println()
//好用的until会生成一个Range
//reverse是将前面生成的Range反转
for (i <- (0 until array1.length).reverse)
print(i+"\t")

1.3 数组转换
yield 关键字将原始的数组进行转换会产生一个新的数组,原始的数组不变

object ArrayYieldDemo {
def main(args: Array[String]): Unit = {
//定义一个数组
val arr =Array(1,2,3,4,5,6,7,8,9)
//将偶数取出乘以10后再生成一个新的数组
val res = for(e <- arr if e % 2==0 ) yield e * 10
println(res.toBuffer)
//更高级的写法,用着更爽
//filter是过滤器,接受一个返回值boolean的函数
//map相当于将数组中的每一个元素取出来,应用传进去的函数
val r = arr.filter(_ % 2 ==0).map(_*10)
println(r.toBuffer)
}
}

1.4 常用数组的算法
在Scala中,数组上的某些方法对数组进行相应的操作非常方便!

2 映射(Map)
在Scala中,把哈希表这种数据结构叫做映射
2.1 构建映射

2.2 获取和修改映射中的值

好用的getorElse

注意:在Scala中,有两个Map,一个是immutable包下的Map,该Map中的内容不可变,另一个是mutable包下的Map,该Map中的内容可变

注意:通常我们在创建一个集合时会用val这个关键字修饰一个变量(相当于java中的final),那么就意味着变量的引用不可变,该引用的内容是不是可变的,取决于这个引用指向的集合的类型
2.3 将对偶的集合转换成映射

3 元组
映射是k/v对偶的集合,对偶是元组的最简单的形式,元组可以装着多个不同类型的值
3.1 创建元组

3.2 获取元组中的值

3.3拉链操作
zip命令可以将多个值绑定在一起(有点python 风~)

注意:如果两个数组的元素个数不一致,拉链操作后生成的数组的长度为较小的那个数组的元素的个数
4 集合
Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质
在Scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable 类型的集合初始化后就不能改变了(注意与val修饰的变量进行区分)
4.1 序列
不可变的序列 import scala.collection.immutable._
在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表
9::List(5,2)::操作符是将给定的头和尾创建一个新的列表
注意: ::操作符是右结合的,如9 ::5 ::2 ::Nil 相当于 9::(5::(2::Nil))
object ImmutListDemo {
def main(args: Array[String]): Unit = {
//创建一个不可变的集合
val lst1 = List(1,2,3)
//将0插入到lst1的前面生成一个新的list
val lst2 = 0::lst1
val lst3 = lst1.::(0)
val lst4 = 0+:lst1
val lst5 = lst1.+:(0)
//将一个元素添加到lst1的后面产生一个新的集合
val lst6 = lst1 :+3
val lst0 = List(4,5,6)
//将2个list合并成一个新的List
val lst7 = lst1 ++ lst0
//将lst1插入到lst0前面生成一个新的集合
val lst8 = lst1 ++: lst0
//将lst0插入到lst1前面生成一个新的集合
val lst9 = lst1. :::(lst0)
println(lst9)
}
}
4.2 Set
4.3 Map
Scala从入门到放弃(三)Scala的数组、映射、元组和集合的更多相关文章
- Scala入门系列(三):数组
Array 与Java的Array类似,也是长度不可变的数组,此外,由于Scala与Java都是运行在JVM中,双方可以互相调用,因此Scala数组的底层实际上是Java数组. 注意:访问数组中元素使 ...
- Kafka从入门到放弃(三) —— 详说生产者
上一篇对Kafka做了简单介绍,还没看的朋友可以点击下方链接. Kafka从入门到放弃(一) -- 初识别Kafka 消息中间件必须与生产者和消费者一起存在才有意义,这次先来聊聊Kafka的生产者. ...
- hive从入门到放弃(三)——DML数据操作
上一篇给大家介绍了 hive 的 DDL 数据定义语言,这篇来介绍一下 DML 数据操作语言. 没看过的可以点击跳转阅读: hive从入门到放弃(一)--初识hive hive从入门到放弃(二)--D ...
- Scala学习——数组/映射/元组
[<快学Scala>笔记] 数组 / 映射 / 元组 一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初 ...
- <spark入门><Intellj环境配置><scala>rk入门><Intellj环境配置><scala>
# 写在前面: 准备开始学spark,于是准备在IDE配一个spark的开发环境. 嫌这篇格式不好的看这里链接 用markdown写的,懒得调格式了,么么哒 # 相关配置: ## 关于系统 * mac ...
- robotium从入门到放弃 三 基于apk的自动化测试
1.apk重签名 在做基于APK的自动化测试的过程中,需要确保的一点是,被测试的APK必须跟测试项目具有相同的签名,那怎么做才能确保两者拥有相同的签名呢?下面将给出具体的实现方法. 首先将被测 ...
- storm从入门到放弃(三),放弃使用《StreamId》特性。
序:StreamId是storm中实现DAG有向无环图的重要一个特性,但是从实际生产环境来看,这个功能其实蛮影响生产环境的稳定性的,我们系统在迭代时会带来整体服务的不可用. StreamId是stor ...
- Go语言从入门到放弃(三) 布尔/数字/格式化输出
本章主要介绍Go语言的数据类型 布尔(bool) 布尔指对或者错,也就是说bool只有两个值, True 或 False 两个类型相同的值可以使用比较运算符来得出一个布尔值 当两个值是完全相同的情况下 ...
- MyBatis从入门到放弃三:一对一关联查询
前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是使用association属性和resultM ...
随机推荐
- 【vim】vim的收藏集
[vim]vim的收藏集 刚接触vim,还木有时间专门研究一下自己的配置,所以暂时贴下网上分享的配置 2019-07-13 14:22:08 无插件的版本 https://my.oschina.net ...
- Python笔记(二十二)_魔法方法_基本魔法方法
__init__(self[,...]) __init__和__new__组成python的构造器,但__init__更多的是负责初始化操作,相当于一个项目中的配置文件,__new__才是真正的构造函 ...
- idea奇葩问题汇总
1.用idea在tomcat里运行普通的springMVC项目,用nacos做为配置中心,通过@NacosValue来读取配置中心的值,配置了autoRefreshed = true但是不起作用,读取 ...
- c# asp.net uploadify 上传大文件 出现的 HTTP 404 问题
用uploadify在IIS6下上传大文件没有问题,但是迁移到IIS7下面,上传大文件时,出现HTTP 404错误. 查了半天,原来是IIS7下的默认设置限制了上传大小.这个时候Web.Config中 ...
- 第四周总结&第二次实验报告
实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: 理解类和对象的区别,掌握构造函数的使用,熟悉通过对象名引用实例的方法和属性 ...
- 多线程11-AutoResetEvent
); Console.WriteLine()); t.Start(); Console.WriteLine()); ...
- DB2创建库 数据恢复
例:数据库:PRODB2用户 :DB2ADMIN/DB2ADMIN备份库路径:D:/bank 一.恢复数据库1.启动数据库运行->db2cmd->db2Db2=>start db m ...
- [APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释)
[APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释) 题面 略 分析 考试的时候就感觉子任务4是突破口,结果却写了个Kruskal重构树,然后一直想怎么在线用数据结构维护 实 ...
- selenium安装及环境搭建
说明:安装selenium前提必须是安装好了python和pip 1.安装python 在Python的官网 www.python.org 中找到最新版本的Python安装包(我的电脑是windows ...
- 通过设置代理解决AndroidStudio无法下载gradle问题
一.AndroidStudio代理 我们平时在使用android studio时,难免需要从android官网下载一些项目运行所需要的SDK文件,但是因为android官网在国外,访问起来会比较慢,所 ...