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的计数