Array

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

注意:访问数组中元素使用()而不是Java中的 []

scala> val a = new Array[String](10)
a: Array[String] = Array(null, null, null, null, null, null, null, null, null, n
ull)
scala> val a = new Array[Boolean](10)
a: Array[Boolean] = Array(false, false, false, false, false, false, false, false
, false, false)
scala> a(0)
res15: Boolean = false
scala> val a = new Array[Int](10)
a: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
scala> a(0) = 1



可以直接使用Array()创建数组,元素类型自动推断(如果类型不一致则为公共父类型

scala> val a = Array("Hello", "World")
a: Array[String] = Array(Hello, World)
scala> val a = Array("Sparks", 30)
a: Array[Any] = Array(Sparks, 30) // 常见操作
scala> val a = Array(3,4,1,2,5,3)
a: Array[Int] = Array(3, 4, 1, 2, 5, 3)
scala> val sum = a.sum
sum: Int = 18
scala> val max = a.max
max: Int = 5
scala> scala.util.Sorting.quickSort(a)
scala> a
res35: Array[Int] = Array(1, 2, 3, 3, 4, 5)
scala> a.mkString
res36: String = 123345
scala> a.mkString(",")
res37: String = 1,2,3,3,4,5
scala> a.mkString("<",",",">")
res38: String = <1,2,3,3,4,5>
// Array的toString有些问题
scala> a.toString
res39: String = [I@ffd26d1
scala> b.toString
res40: String = ArrayBuffer(1, 6, 7, 8, 9, 10)

ArrayBuffer

类似于Java中的ArrayList长度可变集合类

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
scala> val b = ArrayBuffer[Int]()
b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
// 使用+=添加一个或者多个元素,spark源码中大量使用!!!
scala> b += 1
res17: b.type = ArrayBuffer(1)
scala> b += (2,3,4,5)
res18: b.type = ArrayBuffer(1, 2, 3, 4, 5)
// 使用++=添加其他集合中的所有元素
scala> b ++= Array(6, 7, 8, 9, 10)
res19: b.type = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// trimEnd方法可以从尾部截断指定个数的元素
scala> b.trimEnd(5)
scala> b
res21: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)
// 使用insert()函数可以在指定位置插入一个或者多个元素,效率较低
scala> b.insert(5,6)
scala> b.insert(6, 7, 8, 9, 10)
scala> b
res24: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// 使用remove()函数可以移除指定位置的一个或者多个元素
scala> b.remove(1)
res25: Int = 2
scala> b.remove(1, 3)
scala> b
res27: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 6, 7, 8, 9, 10)
// Array与ArrayBuffer互相转化
scala> b.toArray
res28: Array[Int] = Array(1, 6, 7, 8, 9, 10)
scala> a.toBuffer
res29: scala.collection.mutable.Buffer[Any] = ArrayBuffer(Sparks, 30)

遍历Array和ArrayBuffer

  1. 使用until是RichInt提供的函数

    for (i <- 0 until b.length)

    print(b(i))

  2. 跳跃遍历,步进长度

    for (i <- 0 until (b.length, 2))

    print(b(i))

  3. 从尾部遍历

    for (i <- (0 until b.length).reverse)

    println(b(i))

  4. 使用“增强for循环”遍历

    for (e <- b)

    println(e)

数组操作之数组转换

1.使用yield

scala> val a = Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5) scala> val a2 = for(ele <- a) yield ele*ele
a2: Array[Int] = Array(1, 4, 9, 16, 25) scala> val a = ArrayBuffer(1,2,3,4,5)
a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5) scala> val a2 = for(ele <- a) yield ele*ele
a2: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 9, 16, 25)

2.使用函数式编程

_ 表示通配符

  • a.filter(_ % 2 == 0).map(2 * _) (推荐方式)
  • a.filter{ _ % 2 == 0} map {2 * _}

实战:移除第一个负数之后的所有负数

// 构建数组
scala> val a = ArrayBuffer[Int]()
a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
scala> a += (1,2,3,4,5,-1,-3,-5,-9)
res45: a.type = ArrayBuffer(1, 2, 3, 4, 5, -1, -3, -5, -9) // 发现第一个负数之后的负数,就进行移除,性能较差,多次移动数组
var foundFirstNegative = false
var index = 0
while(index < a.length) {
if (a(index) >= 0) {
index += 1
}
else {
if (!foundFirstNegative) {foundFirstNegative=true; index += 1}
else { a.remove(index)}
}
} //检索出所有需要元素的下标,然后将所有需要的元素左移至数组左侧,删除右侧不需要的元素。
//改良版,性能较高
var foundFirstNegative = false
val vaildIndex = for (i <- 0 until a.length if (!foundFirstNegative || a(i) >= 0)) yield {
if (a(i) < 0) foundFirstNegative = true
i
}
for(i <- 0 until vaildIndex.length) {a(i) = a(vaildIndex(i))}
a.trimEnd(a.length - vaildIndex.length)

Scala入门系列(三):数组的更多相关文章

  1. C# 互操作性入门系列(三):平台调用中的数据封送处理

    好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...

  2. [转]C# 互操作性入门系列(三):平台调用中的数据封送处理

    参考网址:https://www.cnblogs.com/FongLuo/p/4512738.html C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列( ...

  3. mybatis入门系列三之类型转换器

    mybatis入门系列三之类型转换器 类型转换器介绍 mybatis作为一个ORM框架,要求java中的对象与数据库中的表记录应该对应 因此java类名-数据库表名,java类属性名-数据库表字段名, ...

  4. ActiveMQ入门系列三:发布/订阅模式

    在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...

  5. Scala入门系列(十二):隐式转换

    引言 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功 ...

  6. Scala入门系列(十三):类型参数

    引言 Scala中类型参数是什么呢?其实就类似于Java中的泛型.定义一种类型参数,比如在集合.类.函数中定义类型参数,然后就可以保证使用到该类型参数的地方就只能是这种类型,从而实现程序更好的健壮性. ...

  7. ES6入门系列三(特性总览下)

    0.导言 最近从coffee切换到js,代码量一下子变大了不少,也多了些许陌生感.为了在JS代码中,更合理的使用ES6的新特性,特在此对ES6的特性做一个简单的总览. 1.模块(Module) --C ...

  8. Scala入门系列(四):Map & Tuple

    Map 创建Map // 创建一个不可变的Map scala> val ages = Map("Leo" -> 30, "Sparks" -> ...

  9. Scala入门系列(十一):模式匹配

    引言 模式匹配是Scala中非常有特色,非常强大的一种功能. 类似于Java中的switch case语法,但是模式匹配的功能要比它强大得多,switch只能对值进行匹配,但是Scala的模式匹配除了 ...

随机推荐

  1. Get與Post的區別--總結隨筆

    關於Get與Post的區別的文章,在網上太多了:有優點有缺點,今天我給各位大哥做一個總結性的隨筆,還請多多包涵~ 首先是W3School上的答案,請查收: GET在浏览器回退时是无害的,而POST会再 ...

  2. springMVC第一天——入门、整合与参数绑定

    大纲摘要: 1.Springmvc介绍 2.入门程序 3.Springmvc架构讲解 a) 框架结构 b) 组件说明 4.Springmvc整合mybatis 5.参数绑定 乱码问题解决 a) Spr ...

  3. WPF 主题

    原文:WPF 主题 WPF 切换主题 string packUri = String.Format(@"/WpfControlLibrary1;component/Dictionary1.x ...

  4. 对Dataguard的三种模式的理解

    模式1:最大可保护模式: 必须同步. 模式2:最大可用性模式: 能同步就同步,不能同步就不同步. 模式3:最大性能模式: 异步模式.

  5. [NOI2007]货币兑换 cdq分治,斜率优化

    [NOI2007]货币兑换 LG传送门 妥妥的\(n \log n\)cdq做法. 这题用cdq分治也可以\(n \log n\)但是在洛谷上竟然比一些优秀的splay跑得慢真是见了鬼了看来还是人丑常 ...

  6. CSS快速入门-后端布局

    一.后台框架概述 我们在网上随便搜索后台框架,你会发现大部分都查不多.正所谓:好看的皮囊千篇一律,有趣的灵魂万里挑一. 第一个是H-ui,H-ui.admin是用H-ui前端框架开发的轻量级网站后台模 ...

  7. div滤镜结合ajax,实现登录

    一:登陆页面 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www. ...

  8. 六种流行的语言大餐---C、C++、python、Java、php、C#你更喜欢哪一个呢?

    引言 鉴于五一期间超大的人流量,LZ思来想去,最终还是选择蜗居在自己的出租屋.无聊之际,当然不能忘了做点什么事情,于是LZ就研究了一下几种语言的皮毛,在这里献丑一翻,希望各位猿友莫要见笑. 不过说来也 ...

  9. 第一阶段·Linux运维基础-第1章·Linux基础及入门介绍

    01-课程介绍-学习流程 02-服务器硬件-详解 03-服务器核心硬件-服务器型号-电源-CPU 01-课程介绍-学习流程 1.1. 光看不练,等于白干: 1.2 不看光练,思想怠慢: 1.3 即看又 ...

  10. NO--14 微信小程序,左右联动二

    上一篇讲解了左=>右联动,那个还比较简单,本篇写剩下比较核心的部分,也是本次开发过程中遇到最难的部分,右=>左联动,先简单看一下演示   右左联动.gif 一.关键技术: (1) 小程序 ...