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. Foxit_PDF_Editor(特别版)-PDF文档编辑器 V2.21 V3.1

    完全反编辑PDF,需要下载. 链接:https://pan.baidu.com/s/1QLIr_2O-WDncVm9veW8JSw 提取码:zf2a

  2. [Udemy] ES 7 and Elastic Stack - part 1

    Section 1 基本概念: Index(indices) 相当于 关系型数据库的 table, document 相当于关系型数据库的 row,  还有一个type的概念(可以理解为table的s ...

  3. idea 2017 快捷键

    Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 Shift+Click,可以关闭文件 C ...

  4. js字符串、数组处理方法、以及一些常用js方法

    1.截取获得某字符串后面的字符: var i = id.substring(id.indexOf("+") + 1, id.length);//获取+后面的字符 2.截取量字符串之 ...

  5. Codeforces 191C (LCA+树上差分算法)

    题面 传送门 题目大意: 给出一棵树,再给出k条树上的简单路径,求每条边被不同的路径覆盖了多少次 分析 解决这个问题的经典做法是树上差分算法 它的思想是把"区间"修改转化为左右端点 ...

  6. HDU 6697 Closest Pair of Segments(线段距离)

    首先最容易想到的就是N2暴力枚举所有线段去找最小值,但是这样会做了许多无用功.我们可以先对线段排序,使得线段最左侧的端点按照x轴y轴排序,然后我们可以限定在这个线段的矩形框内的所有线段才有可能产生最小 ...

  7. 第021讲:函数:lambda表达式

    0. 请使用lambda表达式将下边函数转变为匿名函数? def fun_A(x, y=): return x * y me:lambda x,y=3:x*y 1.请将下边的匿名函数转变为普通的屌丝函 ...

  8. MFC框架各部分指针获取方式

    MFC框架各部分指针获取方式 前人在CSDN总结的,曾经帮助过我,整理总结一下,希望也能帮助一下别人. 获得CWinApp 获得CMainFrame 获得CChildFrame 获得CDocument ...

  9. 【数据库运维】数据库(server)的时区设置及世界主要地区的时区

    [时区设置不当会有什么问题] 当进行海外项目运维的时候,常常会遇到时区设置的问题.假设时区设置不当 或者 同样项目的server之间的时区不一致,都会有导致项目的数据异常的风险. 假设数据表的字段使用 ...

  10. Hibernate快速入门之CRUD

    一.Hibernate的基本概念 前言 Hibernate是一个ORM框架,ORM是Object Relational Mapping的缩写,即对象关系映射,也就是将面向对象思想的编程语言与关系型数据 ...