scala之数组

来源:互联网 发布:网络计算机 编辑:程序博客网 时间:2024/05/23 17:19

定长数组

  定长数组的定义-可使用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.ArrayBufferimport scala.collection.mutable.ArrayBufferscala> 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.ArrayBufferimport scala.collection.mutable.ArrayBufferscala> val array = new ArrayBuffer[Int]()array: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()scala> array += 1res0: 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.ArrayBufferimport scala.collection.mutable.ArrayBufferscala> 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 ++= array1res4: 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.ArrayBufferimport scala.collection.mutable.ArrayBufferscala> 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.toStringres8: String = ArrayBuffer(1, 2)
注:在数组缓冲的尾端添加或者移除元素是高效的。
  4.在数据指定位置添加或移除元素-使用insert/remove
scala> import scala.collection.mutable.ArrayBufferimport scala.collection.mutable.ArrayBufferscala> 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.toStringres2: String = ArrayBuffer(1, 6, 2, 3)scala> array.insert(1, 9, 8, 7)scala> array.toStringres4: String = ArrayBuffer(1, 9, 8, 7, 6, 2, 3)scala> array.remove(1)res5: Int = 9scala> array.toStringres6: String = ArrayBuffer(1, 8, 7, 6, 2, 3)scala> array.remove(1, 3)scala> array.toStringres8: String = ArrayBuffer(1, 2, 3)
注:在数组非结尾位置插入或移除元素并不是高效的,因为每添加/移除一个或多个元素时,所有在插入/移除位置之后的元素都必须被平移。
  5.变长数组(数组缓冲)到定长数组的转换-使用toArray
scala> import scala.collection.mutable.ArrayBufferimport scala.collection.mutable.ArrayBufferscala> 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.toArrayres1: Array[Int] = Array(1, 2, 3)
注:如果要从定长数组转换为变长数组(数组缓冲)-使用toBuffer方法。

遍历数组和数组缓冲

  在Scala中,你可以使用以下语法遍历数组和数组缓冲,如
scala> import scala.collection.mutable.ArrayBufferimport scala.collection.mutable.ArrayBufferscala> 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 * elemres: Array[Int] = Array(3, 6, 9)scala> val result = for(elem <- array if elem >1) yield 3 * elemresult: 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.sumres0: 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.maxres1: Int = 3scala> array.minres2: Int = 1
注:方法适用于ArrayBuffer。
  3.排序-sorted/sortWith
scala> val array = Array(1,7,2,9)array: Array[Int] = Array(1, 7, 2, 9)scala> array.sortedres3: 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) = 1scala> 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.bufferAsJavaListimport scala.collection.JavaConversions.bufferAsJavaListscala> import scala.collection.mutable.ArrayBufferimport scala.collection.mutable.ArrayBufferscala> val command = ArrayBuffer("a", "b", "c")command: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(a, b, c)scala> import java.lang.ProcessBuilderimport java.lang.ProcessBuilderscala> val pb = new ProcessBuilder(command)pb: ProcessBuilder = java.lang.ProcessBuilder@b16e202
注:Scala缓冲被包装成了一个实现了java.util.List接口的Java类的对象-command会隐式转换为List。(注意引入的包)




原创粉丝点击