scala之数组操作

定长数组

  定长数组的定义-可使用Scala中的Array(在scala包中)。可用如下两种方式定义数组,

 

scala> val arrs = new Array[String](10)
arrs: Array[String] = Array(null, null, null, null, null, null, null, null, null, null)

注:定义一个固定长度为10的String数组,初始值为null,如果为Int类型,则为0,其他数据类型可自行测试一下。

 

 

scala> val nums = Array(2, 3)
nums: Array[Int] = Array(2, 3)

注:定义长度为2的Int数组,类型和长度可以被推断出来,不用显示定义。

 

  在Scala中访问数组,使用()及下标即可,下标从0开始,如,

 

scala> val arrs = new Array[String](2)
arrs: Array[String] = Array(null, null)

scala> arrs(0)="test"

scala> arrs(1)="lm"

scala> print(arrs(1))
lm

注:在JVM中,Scala的Array以Java数组的方式实现。示例中的数组在JVM中的类型为java.lang.String[]。总之,Int、Double或其它与Java中基本类型对应的数组都是基本类型数组。

 


 

变长数组

  在Scala中,若使用变长的数组,可用ArrayBuffer(在scala.collection.mutable包路径下)定义。可用如下方式定义变长数组,

 

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

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

注:定义一个可变长度的Int数组。你也可以这样去定义-结尾不使用括号:val array = new ArrayBuffer[Int],亦可以这样定义:val array = ArrayBuffer[Int]()。

 

变长数组的基本使用

 

  1.在数组尾端添加元素-使用+=

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

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

scala> array += 1
res0: array.type = ArrayBuffer(1)

scala> array += (2, 3, 4, 5)
res1: array.type = ArrayBuffer(1, 2, 3, 4, 5)
注:第一种为添加一个元素,第二种为添加多个元素,多个元素用括号包围并用逗号分隔。
  2.在数组尾端追加任何集合-使用++=
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

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

scala> array += (1, 2, 3)
res2: array.type = ArrayBuffer(1, 2, 3)

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

scala> array1 += (4, 5, 6)
res3: array1.type = ArrayBuffer(4, 5, 6)

scala> array ++= array1
res4: array.type = ArrayBuffer(1, 2, 3, 4, 5, 6)

scala> array ++= Array(7, 8, 9)
res5: array.type = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)
  3.在数组尾端移除元素-使用trimEnd
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

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

scala> array += (1, 2, 3)
res6: array.type = ArrayBuffer(1, 2, 3)

scala> array.trimEnd(1)

scala> array.toString
res8: String = ArrayBuffer(1, 2)
注:在数组缓冲的尾端添加或者移除元素是高效的。
  4.在数据指定位置添加或移除元素-使用insert/remove
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

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

scala> array += (1, 2, 3)
res0: array.type = ArrayBuffer(1, 2, 3)

scala> array.insert(1, 6)

scala> array.toString
res2: String = ArrayBuffer(1, 6, 2, 3)

scala> array.insert(1, 9, 8, 7)

scala> array.toString
res4: String = ArrayBuffer(1, 9, 8, 7, 6, 2, 3)

scala> array.remove(1)
res5: Int = 9

scala> array.toString
res6: String = ArrayBuffer(1, 8, 7, 6, 2, 3)

scala> array.remove(1, 3)

scala> array.toString
res8: String = ArrayBuffer(1, 2, 3)
注:在数组非结尾位置插入或移除元素并不是高效的,因为每添加/移除一个或多个元素时,所有在插入/移除位置之后的元素都必须被平移。
  5.变长数组(数组缓冲)到定长数组的转换-使用toArray
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

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

scala> array +=(1, 2, 3)
res0: array.type = ArrayBuffer(1, 2, 3)

scala> array.toArray
res1: Array[Int] = Array(1, 2, 3)
注:如果要从定长数组转换为变长数组(数组缓冲)-使用toBuffer方法。

遍历数组和数组缓冲

  在Scala中,你可以使用以下语法遍历数组和数组缓冲,如
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

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

scala> array +=(1, 2, 3)
res2: array.type = ArrayBuffer(1, 2, 3)

scala> for(arr <- 0 until array.length) print(array(arr) + ",")
1,2,3,
注:until是RichInt类的方法,返回所有小于但不包括上线的数字,上述for循环的结构如下:for(i <- 区间),变量i会遍历区间所包含的所有值。如果想要每两个元素一跳,你可使用0 until (array.length, 2);如果你想从数组的尾端开始遍历,你可使用(0 until a.length).reverse;如果在循环体中不需要使用数据下标,你也可以直接访问数组元素,如 elem <- array。

数组转换

  在Scala中,你可以使用for推导式即用for(...) yield实现,如
scala> val array = Array(1,2,3)
array: Array[Int] = Array(1, 2, 3)

scala> val res = for(elem <- array) yield 3 * elem
res: Array[Int] = Array(3, 6, 9)

scala> val result = for(elem <- array if elem >1) yield 3 * elem
result: Array[Int] = Array(6, 9)
注:for(...) yield循环创建了一个类型与原始集合相同的新类型。你也可以在for中使用守卫等功能,请留意结果是一个新的集合-原始的集合没有受到影响。

常用算法

  1.求和-sum
scala> val array = Array(1,2,3)
array: Array[Int] = Array(1, 2, 3)

scala> array.sum
res0: Int = 6
注:求和方法同样适用于ArrayBuffer。若要使用sum方法,数据类型要为如下几种类型,即整形、浮点数、BigInteger、BigDecimal。
  2.最大值/最小值-max/min
scala> val array = Array(1,2,3)
array: Array[Int] = Array(1, 2, 3)

scala> array.max
res1: Int = 3

scala> array.min
res2: Int = 1
注:方法适用于ArrayBuffer。
  3.排序-sorted/sortWith
scala> val array = Array(1,7,2,9)
array: Array[Int] = Array(1, 7, 2, 9)

scala> array.sorted
res3: Array[Int] = Array(1, 2, 7, 9)

scala> array.sortWith(_>_)
res4: Array[Int] = Array(9, 7, 2, 1)
注:使用sorted及sortWith方法排序,不影响原始数组。sortWith参数接受一个函数。
scala> val array = Array(1,6,2,9)
array: Array[Int] = Array(1, 6, 2, 9)

scala> scala.util.Sorting.quickSort(array)

scala> array.mkString(", ")
res10: String = 1, 2, 6, 9
注:你可以直接对一个数组排序,但是不能对数据缓冲-可变数组排序,直接排序会改变原始数组。若要使用直接排序,则需要带有Ordered特质。mkString方法-把数组以参数为分隔符组装为字符串。

多维数组

  在Scala中,多维数组也是通过数组的数组来实现的。如,
scala> val array = Array.ofDim[Int](2,2)
array: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0))

scala> array(0)(0) = 1

scala> array(0)(0)
res1: Int = 1
注:访问元素使用两对圆括号。
  创建不规则的数组,每一行长度不一,如
scala> val array = new Array[Array[Int]](10)
array: Array[Array[Int]] = Array(null, null, null, null, null, null, null, null, null, null)

scala> for(i <- 0 until array.length) array(i) = new Array[Int](i+1)
注:Array[Array[Int]]的默认值为null。

与Java的互操作

  由于Scala数组是用Java数组实现的,你可以在Java和Scala之间来回传递。如果你调用接受或返回java.util.List的Java方法,则当然可以在Scala代码中使用Java的ArrayList-但那样做没有什么意思。你完全可以引入scala.collection.JavaConversions里的隐式转换方法。这样,你就可以在代码中使用Scala缓冲,在调用Java方法时,这些对象会被自动包装成Java列表。如,java.lang.ProcessBuilder类有一个以List<String>为参数的构造器,请看一下示例,
scala> import scala.collection.JavaConversions.bufferAsJavaList
import scala.collection.JavaConversions.bufferAsJavaList

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

scala> val command = ArrayBuffer("a", "b", "c")
command: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(a, b, c)

scala> import java.lang.ProcessBuilder
import java.lang.ProcessBuilder

scala> val pb = new ProcessBuilder(command)
pb: ProcessBuilder = java.lang.ProcessBuilder@b16e202
注:Scala缓冲被包装成了一个实现了java.util.List接口的Java类的对象-command会隐式转换为List。(注意引入的包)
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值