前言

本篇主要讲Scala的Array、BufferArray、List,更多教程请参考:Scala教程

本篇知识点概括

  • 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer
  • 提供初始值时不要使用new,复杂对象数组没有提供初始值时必须提供new
  • 用()来访问元素
  • 用for(elem <- arr)来遍历数组
  • 用for(elem <- arr if...)...yield...来将原数组转型为新数组
  • Scala数组和Java数组可以互操作

数组

1、定长数组定义:

//定义一个长度为10的数值数组
scala> val numberArray = new Array[int](10)
numberArray:Array[Int] = Array(0,0,0,0,0,0,0,0,0,0)
//定义一个长度为10的String类数组
scala> val strArray = new Array[String](10)
strArray:Array[String] = Array(null, null, null, null, null, null, null, null, null, null)

//由上可以看出,复杂对象类型在数组定义时被初始化为null,数值型呗初始化为0,并且上面复杂类型定义的时候必须加new,否则会报错

//提供初始值的定义数组
scala> val strArray2 = Array("First", "Second")  //这里说明已提供初始值就不需要new
strArray2:Array[String] = Array(First, Second)

scala> strArray2(0) = "Goodbye"
strArray2:Array[String] = Array(Goodbye, Second)

2、变长数组定义
对于长度需要变化的数组,Java有ArrayList,C++有vector。Scala中的等效数据结构为ArrayBuffer

//导入可变包,Scala中的可变集合都是放在mutable中,使用时要导入
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

scala> val arrayBuffer = ArrayBuffer[Int]()
arrayBuffer: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

//在尾部添加一个值
scala> arrayBuffer += 1
res17: arrayBuffer.type = ArrayBuffer(1)

//在尾部添加多个元素
scala> arrayBuffer += (2, 3, 4, 5)
res19: arrayBuffer.type = ArrayBuffer(1, 2, 3, 4, 5)

//在尾部添加一个集合
scala> arrayBuffer ++= Array(6, 7, 8, 9)
res20: arrayBuffer.type = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)

//移除最后2个元素
scala> arrayBuffer.trimEnd(2)

//在开头移除1一个元素
scala> arrayBuffer.trimStart(2)

scala> arrayBuffer
res23: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(2, 3, 4, 5, 6, 7)

//在任意位置插入或者删除元素
scala> arrayBuffer.insert(2, 6)
//ArrayBuffer(2, 3, 6, 4, 5, 6, 7)

scala> arrayBuffer.insert(1, 2, 3, 4)
//ArrayBuffer(2, 1, 2, 3, 4, 3, 6, 4, 5, 6, 7)

scala> arrayBuffer.remove(2)
//ArrayBuffer(2, 1, 3, 4, 3, 6, 4, 5, 6, 7)

scala> arrayBuffer.remover(1, 8)
//ArrayBuffer(2, 7)

3、变长数组和定长数组转换

//变长转换长定长
scala > arrayBuffer.toArray
//Array(2, 7)

//定长转换成变长
scala>res7.toBuffer
//ArrayBuffer(2, 7)

4、遍历定长和变长数组

for(i <- 0 until.arrayBuffer.length)
    println(i + ": " + a(i))

0 until.arrayBuffer.length实际上是一个方法调用,返回的是一个区间Range: 0.until(arrayBuffer.length)
for(i 如果想要在区间中步长不为1,则:0 until (arrayBuffer.length, 2)
如果想要数组从尾端开始,则遍历的写法为:(0 until (arrayBuffer.length, 2)).reverse

Scala也提供了一个和Java增强for循环类似的for

//增强for
for(i <- arrayBuffer)
    println(i + ": " + a(i))

5、数组转换
《Scala入门学习笔记二-基本数据类型、程序控制结构》提到在for循环推导式,可以利用原来的数组产生一个新的数组。

scala> val a = Array(2, 3, 5, 7, 11)
a: Array[Int] = Array(2, 3, 5, 7, 11)
//这里产生了一个新的数组,原来的数组也在
scala> val result = for(elem <- a) yield 2 * elem
result: Array[Int] = Array(4, 6, 10, 14, 22)

如果for中使用的是定长数组,则for(...)...yield之后得到的是定长数组;如果使用的是变长数组,则会得到变长数组

  • Scala也提供了另外一种做法
scala> a.filter(_ % 2 == 0).map(2 * _)

甚至
scala>a.filter(_ % 2 == 0).map{2 * _}

例子:
给定一个整数的缓冲数组,我们想要移除第一个负数之外的所有负数。有几种做法

//第一种做法:
var first = true
var n = a.length
var i = 0
while(i < n){
    if(a(i) > 0) i += 1
    else{
        if(first) {first = false; i += 1}
        else {a.remove(i); n-= 1}
    }
}

//第二种做法:
//首先使用一个新数组用于记录满足条件的数组的下标
val first = true
val indexes = for(i <- 0 until a.length if first || a(i) > 0) yield {
    if(a(i) < 0) first = false; i
}
//然后将元素移动到该去的位置,截断尾端
for(j <- o until indexes.length) a(j) = a(indexes(j))
a.trimEnd(a.length-indexes.length)

6、常用算法
Scala针对数组提供了一个常用的函数

//定义一个整型数组
scala> val intArr=Array(1,2,3,4,5,6,7,8,9,10)
intArr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

//求和
scala> intArr.sum
res87: Int = 55

//求最大值
scala> intArr.max
res88: Int = 10

scala> ArrayBuffer("Hello","Hell","Hey","Happy").max
res90: String = Hey

//求最小值
scala> intArr.min
res89: Int = 1

//排序
//sorted方法将数组或数组缓冲排序并返回经过排序的数组或数组缓冲,原始数组被保留
scala>val b = ArrayBuffer(1, 7, 2, 9)
b:ArrayBuffer[Int] = ArrayBuffer(1, 7, 2, 9)
scala>val bSorted = b.sorted(_<_)
bSorted: ArrayBuffer[Int] = ArrayBuffer(1, 2, 7, 9)

//toString()方法
scala> intArr.toString()
res94: String = [I@141aba8

//mkString()方法
scala> intArr.mkString(",")
res96: String = 1,2,3,4,5,6,7,8,9,10

scala> intArr.mkString("<",",",">")
res97: String = <1,2,3,4,5,6,7,8,9,10>

7、ArrayBuffer Scaladoc解析
初学者在查看sacaladoc时常常会感到困惑,不用担心,随着学习的深入,api文档中的内容将逐渐清晰
下面给出两个示例:
++=方法传入的参数类型是TraversableOnce Trait的子类,它返回的是更新好的ArrayBuffer

dropWhile传入的是一个函数,该函数返回值是布尔类型,dropWhile反回的是操作后的ArrayBuffer

8、多维数组
和Java一样,多维数组是通过数组的数组来实现的。

//第一种构造方式
val metrix = Array.ofDim[Double](3, 4) //3行 4列

//访问其中的元素
metrix(row)(column)  =42

//可以创建不规则的数组,每一行的长度不相同
val triangle = new Array[Array[Int]](10)
for(i <- 0 until triangle.length)
    trianglr(i) = new Array[Int](i+1)

//在创建的时候赋值
scala> val metrix = Array(Array(1, 2, 3), Array(2.3, 3.4), Array("asdf", "asdfas"))
metrix: Array[Array[_ >: String with Double with Int]] = Array(Array(1, 2, 3), Array(2.3, 3.4), Arra
y(asdf, asdfas))

//打印输出数组
scala> for(i <- metrix) println(i.mkString(" "))
1 2 3
2.3 3.4
asdf asdfas

//输出二维数组的每个值
scala> for(i <- metrix; from = i; j <- from) println(j)
1
2
3
2.3
3.4
asdf
asdfas

Scala入门学习笔记三--数组使用的更多相关文章

  1. Scala入门学习笔记四--List使用

    前言 本篇将介绍一个和Array很相似的集合List,更多内容请参考:Scala教程 本篇知识点概括 List的构造 List与Array的区别 List的常用方法 List伴生对象的方法 ::和:: ...

  2. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  3. Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search)

    原文:Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...

  4. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  5. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  6. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

  7. PHP学习笔记之数组篇

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

  8. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  9. stylus入门学习笔记

    title: stylus入门学习笔记 date: 2018-09-06 17:35:28 tags: [stylus] description: 学习到 vue, 有人推荐使用 stylus 这个 ...

随机推荐

  1. EF架构~EF异步改造之路~让DbContextRepository去实现异步接口

    回到目录 返回异步与并行目录 上一讲中,我们定义了三个异步操作接口,这回我们将对它进行实现,而有一个基础知识需要大家清楚,那就是实现接口的方式,一般我们使用默认的方式(隐式实现),这种方法实现的接口方 ...

  2. maven_spring mvc_mina_dome(实体,文件,批传)(spring mina 初学dome)

    看我们群里经常有人在问mina心跳问题,虽然俺是菜鸟可是觉得挺简单的啊,就写了个dome,希望大家多多提意见. 俺做过一段时间网络协议.所以觉得挺简单的吧.哎呀,反正技术就那样了没啥难的. 废话不多说 ...

  3. python :页面布局 ,后台管理页面之左侧菜单跟着滚动条动

    左侧菜单跟着滚动条动 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:// ...

  4. python内置模块(3)

    博主所有python文章均为python3.5.1环境. 目录: 1.collections 2.subprocess 3.configparser 4.XML 5.shutil 一. collect ...

  5. [转]DIV+CSS和TABLE的区别

    现在全国大大小小的网站都在搞一场技术“革命”,就是所谓“网站重构”说简单点就是DIV+CSS进行网站制作.用DIV+CSS代替传统的Table制作框架和美化页面.百度搜索优化 在重构之前,肯定要了解为 ...

  6. Ext 下拉框联动第一次显示不正常的问题

    做下拉框联动,异步加载数据,第一次显示时数据不准确,不要在combo_2的下拉框直接绑定store,在combo_1的改变事件里调用下面的方法 function GetAllCustomerBrand ...

  7. 【python密码学编程】6.凯撒加密法

    凯撒加密法的迷药是0~25的整数 # _*_ coding:utf-8 _*_ #Caeser Ciper import pyperclip messgae = 'this is my secret ...

  8. 操作系统之CPU管理的直观想法

    计算机:是工具,帮助解决实际问题 操作系统,是为了方便使用硬件 计算机模型: 图灵机,模拟人类计算 起初的图灵机就像一个只会做一道菜的厨师 通用图灵机,核心是设置控制器动作(修改控制器),把逻辑读入控 ...

  9. git pull fails “unable to resolve reference” “unable to update local ref”

    问题 由于有人rebase了分支,或者不知道怎么搞的.其他人拉取代码的时候,发现拉不下来. >git fetch error: cannot lock ref 'refs/remotes/ori ...

  10. 浅谈equals和==

    在java中equals和==都是用来作比较的,可是你知道他们之间有什么区别和联系吗? 首先,在Object类中,本质上equals和==都是一样的,如果查看源码,你会发现这里面equals的内部实现 ...