@Arslan6and6
2016-08-29T02:36:39.000000Z
字数 4839
阅读 1380
scala学习
字符串数组,元素初始化为nullscala> val a = new Array[String](10)a: Array[String] = Array(null, null, null, null, null, null, null, null, null, null)整数数组,元素初始化为0scala> val b = new Array[Int](10)b: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0不需要 newscala> val s = Array("king", "mini")s: Array[String] = Array(king, mini)scala> s(0) = "aoao"
scala的变长数组数据结构为 ArrayBuffer
scala> val b = ArrayBuffer[Int]()b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()或者是:scala> val c = new ArrayBuffer[Int]c: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()用 += 在变长数组尾部加上元素scala> b += 1res4: b.type = ArrayBuffer(1)scala> b += (2, 4, 6)res6: b.type = ArrayBuffer(1, 2, 4, 6)还可以用 -= 删除元素scala> b -= (2)res7: b.type = ArrayBuffer(1, 4, 6)用 ++= 在尾部追加任何数组scala> b ++= Array(3,5,7)res9: b.type = ArrayBuffer(1, 4, 6, 3, 5, 7)用 --=也可以删除数组scala> b --= Array(3,7)res10: b.type = ArrayBuffer(1, 4, 6, 5)用 trimEnd(整数) 删除最后几个元素 高效操作!scala> b.trimEnd(2)scala> b += 0res12: b.type = ArrayBuffer(1, 4, 0)插入元素,后面的元素被平移,效率不高! insert(下标位置, 元素*)scala> b.insert(2,3)res16: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 3, 0)可以插入多个元素scala> b.insert(2, 10, 17, 23)scala> bres19: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 10, 17, 23, 3, 0)用 remove(下标位置) 删除元素 或是 remove(下标位置, 删除元素个数)scala> b.remove(3)res20: Int = 17scala> bres21: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 10, 23, 3, 0)scala> b.remove(3,2)scala> bres23: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 10, 0)
需要构造一个定长数组Array,又不知道长度。可以先构造一个数组缓冲ArrayBuffer,然后用toArray将其转化为 Array b.toArray
相反 用 a.toBuffer可以将定长数组转化为一个缓冲数组
scala> val a = Array(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)a: Array[Int] = Array(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)scala> for(i <- 0 until a.length){| print(i + ":" + a(i) + "\t")| }0:10 1:20 2:30 3:40 4:50 5:60 6:70 7:80 8:90 9:100可以n个一跳scala> for(i <- 0 until (a.length, 2))| print(i + ":" + a(i) + "\t")0:10 2:30 4:50 6:70 8:90scala> for(i <- 0 until (a.length, 3))| print(i + ":" + a(i) + "\t")0:10 3:40 6:70 9:100从尾端遍历,即翻转scala> for(i <- 0 until a.length reverse){| print(i + ":" + a(i) + "\t")}warning: there were 1 feature warning(s); re-run with -feature for details9:100 8:90 7:80 6:70 5:60 4:50 3:40 2:30 1:20 0:10还可以不用下标,直接遍历元素scala> for(elem <- a) print(elem + "\t")10 20 30 40 50 60 70 80 90 100
for推导式 : yield 后得到一个新的定长数组或是新的数组缓冲 ,返回 yield 后表达式的值scala> for(elem <- a) yield 2*elemres38: Array[Int] = Array(20, 40, 60, 80, 100, 120, 140, 160, 180, 200)scala> val b = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)b: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)scala> for(elem <- b ) yield 2*elemres42: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)可以用守卫 if 条件判断过滤复合if条件的元素再生成新的数组进行操作scala> for(elem <- b if elem %2==0) yield 2*elemres41: Array[Int] = Array(4, 8, 12, 16, 20)另一种操作途径scala> b.filter( _ % 2==0).map(2 * _ )res44: Array[Int] = Array(4, 8, 12, 16, 20)甚至scala> b.filter( _ % 2==0)map(2 * _ )res45: Array[Int] = Array(4, 8, 12, 16, 20)
sumscala> Array(1, 3, 5).sumres47: Int = 9maxscala> ArrayBuffer("Mary", "had", "a", "little", "lamb").maxres53: String = littlemaxscala> ArrayBuffer("Mary", "had", "a", "Little", "lamb").maxres54: String = lambmaxscala> ArrayBuffer("mary", "had", "a", "Little", "lamb").maxres55: String = marysort排序 Array 和ArrayBuffer 都可以用scala> val a = Array (1, 9, 21, 30, 5)a: Array[Int] = Array(1, 9, 21, 30, 5)sorted 按升序排序scala> val s = a.sorteds: Array[Int] = Array(1, 5, 9, 21, 30)sortWith 指定顺序排序scala> val sw = a.sortWith( _ > _)sw: Array[Int] = Array(30, 21, 9, 5, 1)scala> val sw = a.sortWith( _ < _)sw: Array[Int] = Array(1, 5, 9, 21, 30)注意:排序后原定长数组或数组缓冲不变,会生成排序后的新数组或定长数或数组缓冲scala> ares56: Array[Int] = Array(1, 9, 21, 30, 5)scala> bres57: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 9, 21, 30, 5)可以对数组本身排序,而不能对数组缓冲排序scala> scala.util.Sorting.quickSort(a)scala> ares60: Array[Int] = Array(1, 5, 9, 21, 30)scala> scala.util.Sorting.quickSort(b)<console>:10: error: overloaded method value quickSort with alternatives:(a: Array[Float])Unit <and>(a: Array[Int])Unit <and>[K](a: Array[K])(implicit evidence$1: scala.math.Ordering[K])Unit <and>(a: Array[Double])Unitcannot be applied to (scala.collection.mutable.ArrayBuffer[Int])scala.util.Sorting.quickSort(b)显示数组或数组缓冲的内容 用 mkString不分割显示内容scala> a.mkStringres72: String = 1592130指定分隔符显示内容scala> a.mkString("|")res71: String = 1|5|9|21|30scala> a.mkString(" | ")res70: String = 1 | 5 | 9 | 21 | 30指定分割符及后缀显示内容scala> a.mkString("<", "|" , ">")res69: String = <1|5|9|21|30>和 toString 相比scala> a.toStringres74: String = [I@c800f96scala> b.toStringres75: String = ArrayBuffer(1, 9, 21, 30, 5)

countscala> val c = Array(-1, 2, 3, -4, 5)c: Array[Int] = Array(-1, 2, 3, -4, 5)scala> c.count(_>0)res79: Int = 3scala> c.count(_<0)res80: Int = 2scala> c.count(_>2)res81: Int = 2+=scala> b+=51res83: b.type = ArrayBuffer(1, 9, 21, 30, 5, 51)scala> b+=51-=9res84: b.type = ArrayBuffer(1, 21, 30, 5, 51, 51)
和Java一样,多维数组是通过数组的数组来实现的。举例来说,Double的二维数组类型为Array[Array[Double]]。要构造这样一个数组,可以用ofDim方法:
scala> val matrix = Array.ofDim[Double](3, 4)matrix: Array[Array[Double]] = Array(Array(0.0, 0.0, 0.0, 0.0), Array(0.0, 0.0, 0.0, 0.0), Array(0.0, 0.0, 0.0, 0.0))要访问其中的元素,使用两对圆括号:matrix(从0开始行标)(从0开始列标)scala> matrix(2)(3) = 42scala> matrixres87: Array[Array[Double]] = Array(Array(0.0, 0.0, 0.0, 0.0), Array(0.0, 0.0, 0.0, 0.0), Array(0.0, 0.0, 0.0, 42.0))可以创建不规则的数组,每一行的长度各不相同val triangle = new Array[Array[Int]](10)