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的数组、映射、元组和集合的更多相关文章

  1. Scala入门系列(三):数组

    Array 与Java的Array类似,也是长度不可变的数组,此外,由于Scala与Java都是运行在JVM中,双方可以互相调用,因此Scala数组的底层实际上是Java数组. 注意:访问数组中元素使 ...

  2. Kafka从入门到放弃(三) —— 详说生产者

    上一篇对Kafka做了简单介绍,还没看的朋友可以点击下方链接. Kafka从入门到放弃(一) -- 初识别Kafka 消息中间件必须与生产者和消费者一起存在才有意义,这次先来聊聊Kafka的生产者. ...

  3. hive从入门到放弃(三)——DML数据操作

    上一篇给大家介绍了 hive 的 DDL 数据定义语言,这篇来介绍一下 DML 数据操作语言. 没看过的可以点击跳转阅读: hive从入门到放弃(一)--初识hive hive从入门到放弃(二)--D ...

  4. Scala学习——数组/映射/元组

    [<快学Scala>笔记] 数组 / 映射 / 元组 一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初 ...

  5. <spark入门><Intellj环境配置><scala>rk入门><Intellj环境配置><scala>

    # 写在前面: 准备开始学spark,于是准备在IDE配一个spark的开发环境. 嫌这篇格式不好的看这里链接 用markdown写的,懒得调格式了,么么哒 # 相关配置: ## 关于系统 * mac ...

  6. robotium从入门到放弃 三 基于apk的自动化测试

      1.apk重签名   在做基于APK的自动化测试的过程中,需要确保的一点是,被测试的APK必须跟测试项目具有相同的签名,那怎么做才能确保两者拥有相同的签名呢?下面将给出具体的实现方法. 首先将被测 ...

  7. storm从入门到放弃(三),放弃使用《StreamId》特性。

    序:StreamId是storm中实现DAG有向无环图的重要一个特性,但是从实际生产环境来看,这个功能其实蛮影响生产环境的稳定性的,我们系统在迭代时会带来整体服务的不可用. StreamId是stor ...

  8. Go语言从入门到放弃(三) 布尔/数字/格式化输出

    本章主要介绍Go语言的数据类型 布尔(bool) 布尔指对或者错,也就是说bool只有两个值, True 或 False 两个类型相同的值可以使用比较运算符来得出一个布尔值 当两个值是完全相同的情况下 ...

  9. MyBatis从入门到放弃三:一对一关联查询

    前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是使用association属性和resultM ...

随机推荐

  1. Oracle删除表时候有外键 不能删除

    SELECT    A .constraint_name,    A .table_name,    b.constraint_nameFROM    user_constraints A,    u ...

  2. DFS序1

    给一棵有根树,这棵树由编号为1..N的N个结点组成.根结点的编号为R.每个结点都有一个权值,结点i的权值为vi .接下来有M组操作,操作分为两类:1 a x,表示将结点a的权值增加x:2 a,表示求结 ...

  3. Docker中使用多阶段Dockerfile构建容器镜像image(镜像优化)

    使用多阶段构建 预计阅读时间: 6分钟 多阶段构建是守护程序和客户端上需要Docker 17.05或更高版本的新功能.多阶段构建对于那些努力优化Dockerfiles同时使其易于阅读和维护的人来说非常 ...

  4. 关于AndroidStudio 配置的默认路径的修改

    AndroidStudio的配置默认路径在 C:\Users\用户名\.AndroidStudio3.0 下,在这里会有一个缺点是C盘会常常空间不够用,所以我就想改到其他盘的.看图: Android ...

  5. C#将MD5后的字符串转为字符数据,随机大小写

    一如下代码 public static string GenerateCode(Guid id, DateTime endTime, string Type) { string str = id + ...

  6. 入手node

    一.安装node(查询使用npm) 二.安装淘宝镜像(查询使用cnpm,安装淘宝镜像之后下载速度会更快) 三.安装相关资料时,在预安装的文件夹使用: shift + 右键, 打开命令行窗口,进入终端

  7. 2018-12-25-win10-uwp-显示SVG

    title author date CreateTime categories win10 uwp 显示SVG lindexi 2018-12-25 10:37:5 +0800 2018-2-13 1 ...

  8. 2018-8-27-C#-powshell-调用

    title author date CreateTime categories C# powshell 调用 lindexi 2018-8-27 16:20:4 +0800 2018-06-18 20 ...

  9. linux精简开机启动服务

    1.可以使用 setup-system services 里面调整,这样调整起来效率低 2.或者 ntsysv 调出来 3.使用脚本一件关闭 #LANG=en chkconfig --list #停止 ...

  10. Conference - open source drives IOT from device to edge

    Open source drives IOT from device to edge 以下都是针对IOT领域的项目: ACRN A Big Little Hypervisor for IoT Deve ...