Scala数组操作

来源:互联网 发布:网络文件服务器搭建 编辑:程序博客网 时间:2024/05/01 11:46

数组要点

若长度固定则使用Array,若长度可能有变化则使用ArrayBuffer;提供初始值时不要使用new;用()来访问元素;用for(elem<-arr)来遍历元素;用for(elem<-arr if...)...yield...来将原数组转型为新数组;Scala数组和Java数组可以互操作,用ArrayBuffer,使用scala.collection.JavaConversions中的转换函数。
例子:
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import scala.collection.mutable.ArrayBuffer;  
  2. object HelloWorld {  
  3.   def main(args: Array[String]) {  
  4.     //实现一个可变的数组(数组缓冲),以下两种方式等价  
  5.     val mutableArr = ArrayBuffer[Int]();  
  6.     val mutableArr2 = new ArrayBuffer[Int];  
  7.     mutableArr += 1; //用+=在尾端添加元素  
  8.     mutableArr +=(1, 2, 3, 4, 5) //在尾端添加多个元素,以括号括起来  
  9.     mutableArr ++= Array(8, 9, 10) //你可以使用++=操作符追加任何集合  
  10.     mutableArr.trimEnd(7) //移除最后7个元素  
  11.     println("length=" + mutableArr.length)  
  12.     println("size=" + mutableArr.size)  
  13.     print("元素=");  
  14.     for (elem <- mutableArr) {  
  15.       print(elem + " , ")  
  16.     }  
  17.   }  
  18. }  
如果你需要在Array和ArrayBuffer之间转换,那么分别调用toArray()和toBuffer()方法即可。

数组转换

如下使用for推导式可以产生一个全新的数组
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. object HelloWorld {  
  2.   def main(args: Array[String]) {  
  3.     val a = Array(2, 3, 5, 6);  
  4.     val result = for (elem <- a) yield elem * 2  
  5.     result.copyToArray(a)  
  6.     for (elem <- a) {  
  7.       print(elem + ",") //output:4,6,10,12,  
  8.     }  
  9.   }  
  10. }  
for(...)yield循环创建了一个类型与原始集合相同的新集合,如果你从数组出发,那么你得到的是另一个数组,如果你从数组缓冲出发,那么在for(...)yield之后得到的也是一个数组缓冲。可以使用如下方式来对满足一定条件的元素进行操作:
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //对元素值是偶数的进行翻倍操作,并舍弃掉值是奇数的元素  
  2.    val b = a.filter(_ % 2 == 0).map(_ * 2);  
  3.    for (elem <- b) {  
  4.      print(elem + ",")  
  5.    }  
再看一个例子:
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import scala.collection.mutable.ArrayBuffer  
  2. object HelloWorld {  
  3.   def main(args: Array[String]) {  
  4.     //移除除第一个负数之外的所有负数  
  5.     val a = ArrayBuffer(1, -2, 3, 5, -4, -5)  
  6.     var first = true  
  7.     //首先收集需要保留的下标,返回的结果是一个vector集合  
  8.     val indexs = for (i <- 0 until a.length if first || a(i) >= 0) yield {  
  9.       if (a(i) < 0) first = false; i  
  10.     }  
  11.     print(indexs) //output:Vector(0, 1, 2, 3)  
  12.     //然后将元素移动到该去的位置,并截断尾端  
  13.     for (j <- 0 until indexs.length) {  
  14.       a(j) = a(indexs(j))  
  15.     }  
  16.     println()  
  17.     a.trimEnd(a.length - indexs.length)  
  18.     print(a)  
  19.   }  
  20. }  

多维数组

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. object HelloWorld {  
  2.   def main(args: Array[String]) {  
  3.     val matrix = Array.ofDim[Double](3, 4) //构造一个三行四列的二维数组  
  4.     matrix(0)(0) = 56 //访问第一个元素  
  5.     val triangle = new Array[Array[Int]](10) //创建一个十行的数组,每一行都是一个Int型的Array  
  6.     for (i <- 0 until (triangle.length)) {  
  7.       triangle(i) = new Array[Int](i + 1) //将每一行实例化成(i+1)列的二维数组  
  8.     }  
  9.     //打印数组  
  10.     for (i <- 0 until (triangle.length)) {  
  11.       for (j <- 0 until (triangle(i).length)) {  
  12.         print(triangle(i)(j) + ",")  
  13.       }  
  14.       println()  
  15.     }  
  16.   }  
  17. }  

本文转自http://blog.csdn.net/shijiebei2009/article/details/38614357,所有权力归原作者所有。

0 0