一、Array 、Array Buffer

1、Array

在Scala中,Array代表的含义与Java中类似,也是长度不可改变的数组。

此外,由于Scala与Java都是运行在JVM中,双方可以互相调用,因此Scala数组的底层实际上是Java数组。例如字符串数组在底层就是Java的String[],
整数数组在底层就是JaVa的Int[]。 数组初始化后,长度就固定下来了,而且元素全部根据其类型初始化:
val a=new Array[Int](10)
val a=new Array[String](10)
可以直接使用Array()创建数组,元素类型自动推断:
val a=Array("hello","world")
a(0)= "hi" ######
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 #scala 用() 访问元素 scala> a
res57: Array[Int] = Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0) scala> a(1)
res58: Int = 0 ######
scala> val a = new Array[String](10)
a: Array[String] = Array(null, null, null, null, null, null, null, null, null, null) scala> a(1)
res60: String = null scala> a(1) = "leo" scala> a(1)
res62: String = leo ######
scala> val a = Array("hello", "word")
a: Array[String] = Array(hello, word) scala> a
res63: Array[String] = Array(hello, word) scala> a(0) = "Hi" scala> a
res66: Array[String] = Array(Hi, word) ######
scala> val a = Array("leo", 30)
a: Array[Any] = Array(leo, 30) #自动类型推断 scala> a.length
res67: Int = 2

2、Array Buffer

在Scala中,如果需要类似于Java中的ArrayList这种长度可变的集合类,则可以使用ArrayBuffer。

//如果不想每次都使用全限定名,则可以预先导入ArrayBuffer类
import scala.collection.mutable.ArrayBuffer //使用ArrayBufer()的方式可以创建一个空的ArrayBuffer
val b=ArrayBuffertlnty() //使用+=操作符,可以添加一个元素,或者多个元素
b += 1
b +=(2,3,4,5) /使用++=操作符,可以添加其他集合中的所有元素
b ++= Array(6,7,8,9,10) //使用trimEnd()函数,可以从尾部截断指定个数的元素
b.trimEnd(5) ######
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer scala> val b = ArrayBuffer[Int]()
b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() scala> b += 1 #scala特有语法,往数组中加元素
res68: b.type = ArrayBuffer(1) scala> b += (2,3,4,5)
res69: b.type = ArrayBuffer(1, 2, 3, 4, 5) scala> b ++= Array(6,7,8,9,10)
res70: b.type = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> b.trimEnd(5) scala> b
res72: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5) ######
/使用insert()函数可以在指定位置插入元素; /但是这种操作效率很低,因为需要移动指定位置后的所有元素
b.insert(5,6)
b.insert(6,7,8,9,10) /使用remove()函数可以移除指定位置的元素
b.remove(1)
b.remove(1,3) //Array与ArrayBuffer可以互相进行转换
b.toArray
a.toBuffer ######
scala> b
res73: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5) scala> b.insert(5,6) scala> b
res75: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6) scala> b.insert
insert insertAll scala> b.insert(6,7,8,9,10) scala> b
res77: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> b.remove(1)
res78: Int = 2 scala> b
res79: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 3, 4, 5, 6, 7, 8, 9, 10) scala> b.remove(1,3) scala> b
res81: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 6, 7, 8, 9, 10) scala> var bArray = b.toArray
bArray: Array[Int] = Array(1, 6, 7, 8, 9, 10) scala> var aArrayBuffer = a.toBuffer
aArrayBuffer: scala.collection.mutable.Buffer[Any] = ArrayBuffer(leo, 30)

3、遍历Array ArrayBuffer

//使用for循环和until遍历Array/ArrayBufer

/使until是Richlnt提供的函数
for(i<-0 until b.length)
printin(b(i)) //跳跃遍历Array/ArrayBuffer
for(i <- 0 until(b.length,2))
printin(b(i) //从尾部遍历Array/ArrayBuffer
for(i<-(0 until b.length).reverse)
printin(bi)) /使用“增强for循环”遍历Array/ArrayBuffer
for(e <- b)
printin(e) ######
scala> for (i <- 0 until b.length) println(b(i))
1
6
7
8
9
10 scala> for (i <- 0 until (b.length, 2)) println(b(i)) #指定步长
1
7
9 scala> for (i <- (0 until b.length).reverse) println(b(i)) #反转
10
9
8
7
6
1 scala> for(e <- b) println(e) #增强for
1
6
7
8
9
10

4、数组常见操作

/数组元素求和
val a=Array(1,2,3,4,5)
val sum=a.sum /获取数组最大值
val max=a.max /对数组进行排序
scala.util.Sorting.quickSort(a) /获取数组中所有元素内容
a.mkString
a.mkString(",") #指定分隔符
a.mkString("<",",",">") //toString函数
a.toString
b.toString

二、数组转换

1、使用yield和函数式编程转换数组

//对Array进行转换,获取的还是Array
val a=Array(1,2,3,4,5)
val a2=for(ele <- a)yield ele * ele //对ArayBuffer进行转换,获取的还是ArrayBuffer
val b=ArrayBuffer[In]()
b +=(1,2,3,4,5)
val b2=for(ele <-b)yield ele * ele /结合if守卫,仅转换需要的元素
val a3 = for(ele <- if ele % 2 == 0)yield ele * ele /使用函数式编程转换数组(通常使用第一种方式)
a.filter (_%2 == 0).map(2 * _)
a.filter {_ % 2 == 0}map{2 * _} ##scala yield
对于for循环的每次迭代,yield都会生成一个将被记住的值。就像有一个你看不见的缓冲区,for循环的每一次迭代都会将另一个新的值添加到该缓冲区。 当for循环结束运行时,它将返回所有已赋值的集合。返回的集合的类型与迭代产生的类型相同,因此Map会生成Map,List将生成List,等等。 另外请注意,最初的集合没有改变。for / yield构造根据您指定的算法创建一个新的集合。 ######
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer scala> val b = ArrayBuffer[Int]()
b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() scala> b += (1,2,3,4,5)
res1: b.type = ArrayBuffer(1, 2, 3, 4, 5) scala> val b2 = for(ele <- b) yield ele * ele
b2: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 9, 16, 25) scala> val a3 = for(ele <- a if ele % 2 == 0) yield ele * ele #yield
a3: Array[Int] = Array(4, 16) scala> a.filter(_ % 2 == 0).map(_ * 2) #
res2: Array[Int] = Array(4, 8) scala> a.filter { _ % 2 == 0} map{ _ * 2}
res3: Array[Int] = Array(4, 8)

2、算法案例

移除第一个负数之后的所有负数;

/构建数组
val a = ArrayBuffer[inty()
a +=(1,2,3,4,5,-1,-3,-5,-9) /每发现一个第一个负数之后的负数,就进行移除,性能较差,多次移动数组
var foundFirstNegative = false
var arrayLength = a.length
var index = 0
while(index < arrayLength){
if(a(index)>= 0){
index += 1
}else{
if(!foundFirstNegative){foundFirstNegative = true;index += 1}
else{a.remove(index);arrayLength -= 1}
}
} ############
//性能较高的

scala> import scala.collection.mutable.ArrayBuffer

import scala.collection.mutable.ArrayBuffer

scala> val a = ArrayBuffer[Int]()

a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

scala> a += (1,2,3,4,5,-1,-3,-5,-9)

res0: a.type = ArrayBuffer(1, 2, 3, 4, 5, -1, -3, -5, -9)

scala> :paste

// Entering paste mode (ctrl-D to finish)

var fountFirstNegative = false

val keepIndexes = for (i <- 0 until a.length if !fountFirstNegative || a(i) >= 0

) yield {
   if (a(i) < 0) fountFirstNegative = true
   i

}

for (i <- 0 until keepIndexes.length) { a(i) = a(keepIndexes(i)) }

a.trimEnd(a.length - keepIndexes.length)

// Exiting paste mode, now interpreting.

fountFirstNegative: Boolean = true

keepIndexes: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 2, 3, 4, 5)

scala> a

res3: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, -1)

3、scala数组的更多相关文章

  1. scala数组

    #scala数组 val A= new Array[T](N) val A = new Array[Int](10) ##变长数组 import scala.collection.mutable.Ar ...

  2. Scala数组| 集合

    arrays :+ 5尾部   头部5 +: arrays TODO 声明不可变数组,不能删; 默认情况下,scala中集合的声明全都是不可变的 val arrays: Array[Int] = Ar ...

  3. Spark记录-Scala数组

    Scala提供了一种数据结构叫作数组,数组是一种存储了相同类型元素的固定大小顺序集合.数组用于存储数据集合,但将数组视为相同类型变量的集合通常更为有用. 可以声明一个数组变量,例如:numbers,使 ...

  4. 【scala】scala 数组 (三)

    基础内容 1. 数组定义 定长.可变数组的定义;元素添加,删除,排序,求和等常用运算 import scala.collection.mutable.ArrayBuffer import scala. ...

  5. Scala数组和集合

    一.scala数组 数组定义1: var arr = new Array[String](3) String:存储的元素类型 3:存储3个元素 添加元素: arr(1) = "hello&q ...

  6. 4、scala数组

    1.Array 2.ArrayBuffer 3.遍历Array和ArrayBuffer 4.数组常见操作 1.  Array Scala中,array代表的含义与java类似,也是长度不可改变的数组. ...

  7. Scala 数组和List

    Scala 数组和List: import scala.collection.mutable.ArrayBuffer import scala.collection.mutable.Buffer ob ...

  8. scala 数组 基本类型

    变量尽量用valvar 是不可变 final 常用的 Int̵ Double̵ Long̵ String没有基本类型.scala 任何对象都继承Any Int Double 继承AnyVal Stri ...

  9. Scala数组小结

    1.定长数组 定长数组:指长度不可变的数组Array. 第一种方式: 先声明一个数组,后初始化该数组: scala> val array = new Array[Double](5) array ...

随机推荐

  1. html学习笔记(2)-字母大小写转换练习

    主要应用了text-transform属性值: uppercase:所有单词的字母都大写: lowercase:所有单词的字母都小写: capitalize:每个单词的首字母都大写: none:默认值 ...

  2. ArcGIS api for javascript 离线部署

    一.说明: 1.本篇文章以及之后的相关的文章所使用的ArcGIS API for javascript 的版本是3.3.初学者为了学习简单,可以引用在线的 Javascript.但是如果只能连接内网, ...

  3. 【学员管理系统】0x01 班级信息管理功能

    [学员管理系统]0x01 班级信息管理功能 写在前面 项目详细需求参见:Django项目之[学员管理系统] 视图函数: 我们把所有的处理请求相关的函数从 urls.py中拿出来,统一放在一个叫view ...

  4. socketserver源码解读

       在看源码之前我们先来看看有关继承的知识(看源码就是在找继承关系----个人理解) 继承 : 我们先看上面的代码,这是一个简单的类继承,我们可以看到父类Base和子类Son,它们中各有一个Test ...

  5. vue 的基本语法

    一 . Vue 的介绍 1 . 前端的三大框架 (可以去 GitHub 查看三个框架的 star 星) vue   :  作者尤雨溪, 渐进式的JavaScript 框架 react :  Faceb ...

  6. AR模型脱卡,unity端实现步骤详情

    AR模型脱卡unity端实现具体步骤 AR模型脱卡的原理 利用一些unity端AR插件做AR应用.通常会有一个需求,当识别物消失的时候,将3D模型从识别物这个父物体上移除,显示在屏幕中央.那么原理就显 ...

  7. 提高iOS开发效率的第三方框架等--不断更新中。。。

    1. Mantle Mantle 让我们能简化 Cocoa 和 Cocoa Touch 应用的 model 层.简单点说,程序中经常要进行网络请求,请求到得一般是 json 字符串,我们一般会建一个 ...

  8. Builder 模式初探

    Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程.该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的 ...

  9. ubuntu下安装redis以及redis客户端在mac下的使用

    ubuntu下安装redis http://blog.fens.me/linux-redis-install/ 此方式利用brew安装包去获取最新的rdm客户端 资源失效了 https://www.j ...

  10. HTML语义化理解

    对所要表达的事物或者思想使用正确的标签. 例如:标题用<h > 来表示. 在<table>中加入summary的简介.   在<a>中加入title 在<im ...