Scala入门系列(三):数组
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
使用until是RichInt提供的函数
for (i <- 0 until b.length)
print(b(i))跳跃遍历,步进长度
for (i <- 0 until (b.length, 2))
print(b(i))从尾部遍历
for (i <- (0 until b.length).reverse)
println(b(i))使用“增强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入门系列(三):数组的更多相关文章
- C# 互操作性入门系列(三):平台调用中的数据封送处理
好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...
- [转]C# 互操作性入门系列(三):平台调用中的数据封送处理
参考网址:https://www.cnblogs.com/FongLuo/p/4512738.html C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列( ...
- mybatis入门系列三之类型转换器
mybatis入门系列三之类型转换器 类型转换器介绍 mybatis作为一个ORM框架,要求java中的对象与数据库中的表记录应该对应 因此java类名-数据库表名,java类属性名-数据库表字段名, ...
- ActiveMQ入门系列三:发布/订阅模式
在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...
- Scala入门系列(十二):隐式转换
引言 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功 ...
- Scala入门系列(十三):类型参数
引言 Scala中类型参数是什么呢?其实就类似于Java中的泛型.定义一种类型参数,比如在集合.类.函数中定义类型参数,然后就可以保证使用到该类型参数的地方就只能是这种类型,从而实现程序更好的健壮性. ...
- ES6入门系列三(特性总览下)
0.导言 最近从coffee切换到js,代码量一下子变大了不少,也多了些许陌生感.为了在JS代码中,更合理的使用ES6的新特性,特在此对ES6的特性做一个简单的总览. 1.模块(Module) --C ...
- Scala入门系列(四):Map & Tuple
Map 创建Map // 创建一个不可变的Map scala> val ages = Map("Leo" -> 30, "Sparks" -> ...
- Scala入门系列(十一):模式匹配
引言 模式匹配是Scala中非常有特色,非常强大的一种功能. 类似于Java中的switch case语法,但是模式匹配的功能要比它强大得多,switch只能对值进行匹配,但是Scala的模式匹配除了 ...
随机推荐
- LaTeX源代码显示宏包listings应用备忘之新语言定义
我目前了解的LaTeX中有关源代码显示的宏包有两个,这里介绍其中的listings宏包.listings宏包中已经定义了部分计算机语言的显示样式,但还是有些语言没有定义,我们一起看一下如何定义新的 ...
- Bluebox Security最新提报Android漏洞的初步探讨(转)
Bluebox Security在7月3号的时候,在官网上发布了一个据称99% Android机器都有的一个漏洞.国内最早在4号开始有媒体报道,并持续升温.该漏洞可使攻击者在不更改Android应用 ...
- Java List添加元素
import java.util.ArrayList; public class Test { public static void main(String[] args) { ...
- OSG选取点云坐标不准的解决办法
一.默认的相机和所有模型求交的方式 1.1 传统的模型与屏幕点求交的方法如下: osgViewer::View* viewer = dynamic_cast<osgViewer::View*&g ...
- 成都Uber优步司机奖励政策(4月19日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- mfc 函数重载
函数重载的概念 for循环中变量 一. 函数重载的概念 函数重载允许我们使用相同的函数名定义多个函数. 提示: 函数参数类型不同,可重载. 类型相同时,则需要参数个数不同. int max(int a ...
- C#阻止系统休眠
阻止系统休眠 using System.Runtime.InteropServices; static class WinSleepCtr { //定义API函数 [DllImport("k ...
- CF535E Tavas and Pashmaks
今天Fakehu考的T1. 大致意思就是有n个人每个人有两个速度\(v_1,v_2\),比赛有两个路程\(A,B\),最后时间是\(A/v_1+B/v_2\).求每个人是否可能成为冠军中的一个. 显然 ...
- SQL Server 内存和换页(Paging)
在进程开始执行时,进程首先申请虚拟地址空间VAS(Virtural Address Space),VAS是进程能够访问的地址空间,由于VAS不是真正的物理内存空间,操作系统必须将VAS隐射到物理内存空 ...
- 百度ueditor 文本框
所需配置(qui框架) <!--ueEditor编辑器start--> <script> window.UEDITOR_HOME_URL = ctx+"/stati ...