scala 数组分为定长数组(Array)和变长数组(ArrayBuffer):
定长数组:
/**
* 定长数组
*/
val array = new Array[Int](10) //定长数组 长度为10 初始化值为0
val strs = new Array[String](10) //定长数组 长度为10 初始化值为null
val str = Array("hello", "scala") //长度为2的字符串数组 类型推断 如果已有初始值 就不需要new
str(0) = "Good"
//Array("Good","scala") 数组访问是通过()
变长数组:
/**
* 变长数组
*/
var buffer = ArrayBuffer[Int]() //new ArrayBuffer[Int]() 空数组buffer
buffer += 1 //尾端添加元素1
buffer +=(2, 3, 4, 5) //尾端添加元素 2 3 4 5
buffer ++= Array(1, 2, 3, 4) //追加集合
buffer.trimEnd(5) //移除最后5元素
//在数组尾端操作元素是高效的
buffer.insert(2, 9) //将元素插入 (2)的位置
buffer.insert(2, 7, 8, 0) //将7,8,0元素插入 (2)的位置
buffer.remove(2) //移除buffer(2)
buffer.remove(2, 3) //移除buffer的3个元素,从2开始计算
buffer.toArray //转换成定长数组
buffer.toArray.toBuffer //将定长数组转换成变长数组
遍历数组:
//遍历数组
for (i <- 0 until buffer.length) println(i + "==" + buffer(i))
//没隔两个元素打印一次
for (i <- 0 until(buffer.length, 2)) println(i + "==" + buffer(i))
//倒序访问
for (i <- (0 until buffer.length).reverse) println(i + "==" + buffer(i))
//java 正常for循环
for (elem <- buffer)
println(elem)
数组转换:
val result = for (elem <- buffer) yield 2 * elem //将原buffer每个元素乘以2 返回一个新的ArrayBuffer
将数组 得到数组中的所有偶数(3个方法 结果一样)<span style="font-family:Comic Sans MS;font-size:14px;"> for (elem <- buffer if elem % 2 == 0) yield 2 * elem
buffer.filter(_ % 2 == 0).map(2 * _)
buffer.filter {
_ % 2 == 0
} map {
2 * _
}</span>
//给定一个buffer数组,移除第一个负数之外的所有负数
var first = true
var indexes = for (i <- 0 until buffer.length if first || buffer(i) > 0) yield {
if (buffer(i) < 0) first = false; i
}
//将大于0的数字排列到前面去
for (j <- 0 until (indexes.length)) buffer(j) = buffer(indexes(j))
buffer.trimEnd(buffer.length - indexes.length)
常用算法:
//求和
Array(1, 7, 8, 9).sum //对于ArrayBuffer 同样适用
ArrayBuffer("java", "scala", "python", "golang", "c/c++", "R").max
Array(1, 7, 8, 9).sorted //按照自然顺序排序
Array(1, 7, 8, 9).sortWith(_>_) //按照从大到小排序
Sorting.quickSort(Array(1, 7, 8, 9)) //只能操作数组 不能对buffer排序
Array(1, 7, 8, 9).mkString("(",",",")") //显示数组,可以直接使用print打印
buffer.count(_>0) //返回所有大于0的计数