@Arslan6and6
2016-08-29T02:36:39.000000Z
字数 4839
阅读 1290
scala学习
字符串数组,元素初始化为null
scala> val a = new Array[String](10)
a: Array[String] = Array(null, null, null, null, null, null, null, null, null, null)
整数数组,元素初始化为0
scala> val b = new Array[Int](10)
b: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0
不需要 new
scala> 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 += 1
res4: 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 += 0
res12: 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> b
res19: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 10, 17, 23, 3, 0)
用 remove(下标位置) 删除元素 或是 remove(下标位置, 删除元素个数)
scala> b.remove(3)
res20: Int = 17
scala> b
res21: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 10, 23, 3, 0)
scala> b.remove(3,2)
scala> b
res23: 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:90
scala> 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 details
9: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*elem
res38: 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*elem
res42: 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*elem
res41: 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)
sum
scala> Array(1, 3, 5).sum
res47: Int = 9
max
scala> ArrayBuffer("Mary", "had", "a", "little", "lamb").max
res53: String = little
max
scala> ArrayBuffer("Mary", "had", "a", "Little", "lamb").max
res54: String = lamb
max
scala> ArrayBuffer("mary", "had", "a", "Little", "lamb").max
res55: String = mary
sort排序 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.sorted
s: 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> a
res56: Array[Int] = Array(1, 9, 21, 30, 5)
scala> b
res57: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 9, 21, 30, 5)
可以对数组本身排序,而不能对数组缓冲排序
scala> scala.util.Sorting.quickSort(a)
scala> a
res60: 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])Unit
cannot be applied to (scala.collection.mutable.ArrayBuffer[Int])
scala.util.Sorting.quickSort(b)
显示数组或数组缓冲的内容 用 mkString
不分割显示内容
scala> a.mkString
res72: String = 1592130
指定分隔符显示内容
scala> a.mkString("|")
res71: String = 1|5|9|21|30
scala> a.mkString(" | ")
res70: String = 1 | 5 | 9 | 21 | 30
指定分割符及后缀显示内容
scala> a.mkString("<", "|" , ">")
res69: String = <1|5|9|21|30>
和 toString 相比
scala> a.toString
res74: String = [I@c800f96
scala> b.toString
res75: String = ArrayBuffer(1, 9, 21, 30, 5)
count
scala> val c = Array(-1, 2, 3, -4, 5)
c: Array[Int] = Array(-1, 2, 3, -4, 5)
scala> c.count(_>0)
res79: Int = 3
scala> c.count(_<0)
res80: Int = 2
scala> c.count(_>2)
res81: Int = 2
+=
scala> b+=51
res83: b.type = ArrayBuffer(1, 9, 21, 30, 5, 51)
scala> b+=51-=9
res84: 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) = 42
scala> matrix
res87: 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)