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. 剑指offer--day07

    1.1 题目:反转链表:输入一个链表,反转链表后,输出新链表的表头. 1.2 思路:这道题,我们要做到的是反转链表,我们的思路是将前一个节点与后一个节点断开,然后让后一个节点指向前一个节点,这个过程就 ...

  2. [开发技巧]·如何让离线安装Python包

    [开发技巧]·如何让离线安装Python包 1.问题描述 PyPI(Python Package Index)是python官方的第三方库的仓库,所有人都可以下载第三方库或上传自己开发的库到PyPI. ...

  3. HashMap为什么在多线程下会让cpu100%

    首先HashMap并不是sun公司多线程提供的集合,很多时候我们的程序是一个主线程,用了hashmap并没有什么问题,但是在多线程下会出现问题. hashmap是一个哈希表,存储的数据结构也可以是一个 ...

  4. docker搭建一个渗透测试环境 bwapp为例

    bwapp是一个渗透测试靶场,他其中中含有100多个Web漏洞  基本涵盖了所有主要的已知Web漏洞,包括OWASP Top 10的各种 首先要去搜索一下  看一下有哪些镜像可以下载    docke ...

  5. 什么是HIS、PACS、LIS、RIS

    什么是HIS?医院信息系统的定义(HIS)医院信息系统(Hospital Information System,HIS)在国际学术界已公认为新兴的医学信息学(Medical Informatics)的 ...

  6. hibernate的get方法和load方法区别

    读者需注意:Hibernate版本不同,运行机制不太一样,以下是hibernate3.x作为讲解 get方法: Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然 ...

  7. spring-第十六篇之AOP面向切面编程之Spring AOP

    1.上一篇介绍了AspectJ在AOP的简单应用,让我们了解到它的作用就是:开发者无需修改源代码,但又可以为这些组件的方法添加新的功能. AOP的实现可分为两类(根据AOP修改源码的时机划分): 1& ...

  8. Java学习day6数组

    ---恢复内容开始--- Java数组 Java 语言中提供的数组是用来存储固定大小的同类型元素.你可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量 number ...

  9. Java学习day5程序控制流程二

    循环结构: 循环语句的四个组成部分:1.初始化部分(init_statement) 2.循环条件部分(test_exp) 3.循环体部分(body_statement) 4.迭代部分(after_st ...

  10. 如何在CentOS 7上安装newman

    前提:先安装nodejs,详见:如何在CentOS 7上安装Node.js和npm #sudo npm install -g newman 结果: /usr/local/bin/newman -> ...