1. 定长数组

如果你需要一个长度不变的数组,可以使用Scala中的Array.

val nums = new Array[Int](10) // 10个整数的数组 所有元素初始化为0
val strs = new Array[String](10) // 10个字符串的数组 所有元素初始化为null
val s = Array("Hello", "World") // 长度为2的Array[String] 类型是推断出来的 
s(0) = "GoodBye" // Array("GoodBye","World")

备注

已提供初始值时不要使用new,例如上面的数组s

使用()而不是[]来访问元素

在JVM中,Scala的Array以Java数组方式实现.

2. 变长数组

对于那种长度按需要变化的数组,Java有ArrayList.Scala中等效数据结构为ArrayBuffer.

import scala.collection.mutable.ArrayBuffer
val b = ArrayBuffer[Int]() // 或者 new ArrayBuffer[Int]() 创建一个空的数组缓冲来存放整数\
b += 1 // ArrayBuffer(1) 用+=在尾端添加元素
b += (1,2,3,5) // ArrayBuffer(1,1,2,3,5) 在尾端添加多个元素
b ++= Array(8, 13, 21) // ArrayBuffer(1,1,2,3,5,8,13,21) 用++=操作追加任何集合
b.trimEnd(5) // ArrayBuffer(1,1,2) 移除最后5个元素

可以在任意位置插入或移除元素,但这样的操作不如在尾端添加或移除元素操作那么高效:

b.insert(2,6) // ArrayBuffer(1,1,6,2) 在下标2之前插入
b.insert(2,7,8,9) // ArrayBuffer(1,1,7,8,9,6,2) 插入任意多的元素
b.remove(2) // ArrayBuffer(1,1,8,9,6,2) 删除下标2的元素
b.remove(2,3) // ArrayBuffer(1,1,2) 第二个参数的含义是要移除多少个元素

有时需要构建一个Array,但不知道最终需要装多少元素.这种情况下可以先构建一个数组缓冲,然后调用:

b.toArray // Array(1,1,2)

3. 遍历数组和数组缓冲

使用for循环遍历数组和数组缓冲:

val b = Array(6,5,4,3,2,1)
for(i <- 0 until b.length){
  println(i + "-" + b(i))
}

输出结果:

0-6
1-5
2-4
3-3
4-2
5-1

备注

until 是RichInt类的方法,返回所有小于(但不包括)上限的数字

如果想要每两个元素一跳,可以让i这样来进行遍历:

val b = Array(6,5,4,3,2,1)
for(i <- 0 until (b.length, 2)){
  println(i + "-" + b(i))
}

输出结果:

0-6
2-4
4-2

如果要从数组的尾端开始:

val b = Array(6,5,4,3,2,1)
for(i <- (0 until b.length).reverse){
  println(i + "-" + b(i))
}

如果在循环体中不需要用到数组下标,我们也可以直接访问数组元素:

for(elem <- b){
  println(elem)
}

4. 数组转换

从一个数组(数组缓冲)出发,以某种方式对它进行转换是很简单的.这些转换操作不会修改原是数组,而是产生一个全新的数组:

val a = Array(1,2,3,4)
val result = for(elem <- a) yield 2 * elem // result 是Array(2,4,6,8)

for(...) yield循环创建了一个类型与原实际和相同的新集合.新元素为yield之后的表达式的值,每次迭代对应一个.

当你遍历一个集合时,如果只想处理满足特定条件的元素.可以通过for中的if来实现:

val a = Array(1,2,3,4)
val result = for(elem <- a if elem % 2 == 0) yield 2 * elem

上面实例中对每个偶数元素翻倍,并丢掉奇数元素.

5. 常用操作

5.1 sum

val a = Array(6,1,7,4)
a.sum // 18

要使用sum方法,元素类型必须是数值类型:整型,浮点数或者BigInteger/BigDecimal

5.2 min max

val a = Array(6,1,7,4)
a.min // 1
a.max // 7

min和max输出数组或数组缓冲中最小和最大的元素

5.3 sorted

val a = Array(6,1,7,4)
val asorted = a.sorted // Array(1, 4, 6, 7)

val a = ArrayBuffer(6,1,7,4)
val asorted = a.sortWith(_ > _) // ArrayBuffer(7, 6, 4, 1)

sorted方法将数组或数组缓冲排序并返回经过排序的数组或数组缓冲,不会修改原始数组.可以使用sortWith方法提供一个比较函数.

5.4 mkString

val a = Array(6,1,7,4)
a.mkString(" and ") // 6 and 1 and 7 and 4

如果想要显示数组或者数组缓冲的内容,可以使用mkString,允许指定元素之间的分隔符

val a = Array(6,1,7,4)
a.mkString("<", ",", ">") // <6,1,7,4>
该方法的另一个重载版本可以让你指定前缀和后缀

[Scala]Scala学习笔记二 数组的更多相关文章

  1. Scala入门学习笔记三--数组使用

    前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...

  2. JavaScript学习笔记之数组(二)

    JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...

  3. PHP学习笔记之数组篇

    摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇   一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...

  4. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  5. Redis学习笔记二 (BitMap算法分析与BitCount语法)

    Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...

  6. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...

  8. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  9. Go语言学习笔记二: 变量

    Go语言学习笔记二: 变量 今天又学了一招如何查看go的版本的命令:go version.另外上一个笔记中的代码还可以使用go run hello.go来运行,只是这种方式不会生成exe文件. 定义变 ...

随机推荐

  1. PyMySQL介绍

    pymysql介绍 PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb Django中也可以使用PyMySQ ...

  2. 对Servlet请求或响应进行JMockit测试

    对Servlet请求及响应进行mock方法, 通过getMockInstance方法对servlet进行打桩,对servlet提供的方法进行mock,替代真正的servlet请求或响应. 参考链接: ...

  3. Sybase:获取本月最后一天的日期的实现方法

    Sybase:获取本月最后一天的日期的实现方法 Oracle中查询月底那天的日期的函数为:last_day(). 在ASE中没有对应的函数,在Oracle移植到Sybase的时候,需要手动编写函数来实 ...

  4. [HAOI2007]反素数ant

    1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1907  Solved: 1069[Submit][St ...

  5. 解析Linux系统的平均负载概念

    一.什么是系统平均负载(Load average)? 在Linux系统中,uptime.w.top等命令都会有系统平均负载load average的输出,那么什么是系统平均负载呢?系统平均负载被定义为 ...

  6. MySQL二进制日志文件过期天数设置说明

    今天在处理业务库中二进制文件的时候,想更改二进制文件的过期天数,发现日期如果设置成2位以上的整数.都会出现如下的警告.不能成功的设置过期日期天数.MySQL版本从5.1到5.5都是一样的. mysql ...

  7. Spring_属性配置细节

    XML 代码: <!-- 使用构造器注入属性值的位置和参数的类型!以区分重载的构造器! --> <bean id="car1" class="com.h ...

  8. windchill系统——一些功能查找

    1.创建产品 导航栏的浏览——>最近的产品——>全部查看——>新建产品——>填写“名称”.选择“模板”.一定的“说明”.“专用访问权限”一般选择“否”——>“确定”选项 ...

  9. Git和GitHub相关

    组员从GitHub上下载项目并上传项目的步骤如下 .组员接收到组长发的项目地址,组员需要从GitHub上把项目克隆下来,首先组员 需要在本地的一个文件夹里打开git,然后运行如下代码:git clon ...

  10. JNIjw01

    1.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_JNIjw01.h" JNIEXPORT void JNICALL ...