目录
定长数组
变长数组
Array和ArrayBuffer相互转换
遍历数组
数组的常见方法
定长数组的定义有种:
scala> val arr1 = Array[Int](1,2,3,4) //创建数组并设置具体内容
arr1: Array[Int] = Array(1, 2, 3, 4)
scala> var arr2 = new Array[Int](10) //创建一个元素类型为Int,元素个数为10的数组,初始化每个元素为0
arr2: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
scala> var arr3 = Array[Int](10) //与arr2相比少了new关键字,查边就很大,此处一定要细心
arr3: Array[Int] = Array(10)
我们编译一段创建数组的scala代码看看,里面到底有啥?
//这是Demo.scala
object Demo {
def main(args:Array[String]) {
val arr1 = Array[Int](10)
var arr2 = new Array[Int](10)
println(arr1)
println(arr2)
}
}
//这是Demo$.class
import scala.Array.;
import scala.Predef.;
import scala.reflect.ClassTag.;
public final class Demo$
{
public static MODULE$;
static
{
new ();
}
public void main(String[] args)
{
//val arr1 = Array[Int](10)与new int[] { 10 }对应
int[] arr1 = (int[])Array..MODULE$.apply(Predef..MODULE$.wrapIntArray(new int[] { 10 }), ClassTag..MODULE$.Int());
//var arr2 = new Array[Int](10)与int[] arr2 = new int[10];对应
int[] arr2 = new int[10];
Predef..MODULE$.println(arr1);
Predef..MODULE$.println(arr2);
}
private Demo$() { MODULE$ = this; }
}
//Demo.class这里就不贴出来了,没有什么重点
在编译后的Demo$.class中可以看到:
val arr1 = Array[Int](10)与new int[] { 10 }对应
var arr2 = new Array[Int](10)与int[] arr2 = new int[10];对应
scala的定长数组Array其实是用java的数组实现的。
scala的变长数组是scala.collection.mutable.ArrayBuffer类,使用时必须先进行引用。
//引用scala.collection.mutable.ArrayBuffer类
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
//创建变长数组
scala> val arr1 = ArrayBuffer[Int]()
arr1: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
上面提到scala的定长数组是用过java的数组实现的,当提到变长数组,可能很多人都会想到java中的List,然而scala中的ArrayBuffer并不是使用List实现的,看一下编译后的源码
val arr3 = ArrayBuffer[Int]()//这是我们创建的定长数组
ArrayBuffer arr3 = (ArrayBuffer)ArrayBuffer..MODULE$.apply(Nil..MODULE$);//编译后他张这样,执行了applay函数
变长数组的简单操作:
//引入ArrayBuffer
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
//创建元素类型为Int类型的可变数组
scala> val arr = ArrayBuffer[Int]()
arr: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
//增加一个元素或一个元组Tuple
scala> arr += 1
res6: arr.type = ArrayBuffer(1)
scala> arr += (2,3)
res8: arr.type = ArrayBuffer(1, 2, 3)
//增加一个数组或集合
scala> arr ++= Array(4,5)
res9: arr.type = ArrayBuffer(1, 2, 3, 4, 5)
scala> arr ++= 6 to 8
res10: arr.type = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8)
//从末尾删除两个元素
scala> arr.trimEnd(2)
scala> arr
res12: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6)
//在下标为2之前插入数值1的元素
scala> arr.insert(2,1)
scala> arr
res14: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 1, 3, 4, 5,
6)
//也可以插入多个元素
scala> arr.insert(2,1,2,3,4)
scala> arr
res16: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 1, 2, 3, 4,
1, 3, 4, 5, 6)
//删除下标为2的元素,remove方法时有返回值的,返回的就是删除的那个元素的值
scala> arr.remove(2)
res17: Int = 1
scala> arr
res18: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 2, 3, 4, 1,
3, 4, 5, 6)
//删除多个元素,第二个参数表示向后删除多少个元素,没有返回值
scala> arr.remove(2,3)
scala> arr
res20: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 1, 3, 4, 5,
6)
//Array和ArrayBuffer互相转换
scala> val bufferToArray = arr.toArray
bufferToArray: Array[Int] = Array(1, 2, 4, 5, 6)
scala> val arrayToBuffer = bufferToArray.toBuffer
arrayToBuffer: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 4, 5, 6)
scala> val arr = Array(0 to 10 : _*)
arr: Array[Int] = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> for(i <- 0 until arr.length) println(i)
0
1
2
3
4
5
6
7
8
9
10
回顾一下“_*”的意思,是把一个Range转成一个Seq,在方法中传入每一个元素
i <- 0 until arr.length,表示0到arr.length-1
遍历时可以设置两个一输出:
scala> val arr = Array(2,4,6,8,10)
arr: Array[Int] = Array(2, 4, 6, 8, 10)
//i <- 0 until (arr.length,2),表示隔一个赋值给i
scala> for(i <- 0 until (arr.length,2)) println(arr(i))
2
6
10
倒序遍历:
scala> val arr = Array(2,4,6,8,10)
arr: Array[Int] = Array(2, 4, 6, 8, 10)
scala> for(i <- (0 until arr.length).reverse) println(arr(i))
10
8
6
4
2
java中有增强for循环的操作,scala中也有,如果不需要使用元素下标,直接访问元素,就可以使用增强for循环操作
scala> val arr = Array(2,4,6,8,10)
arr: Array[Int] = Array(2, 4, 6, 8, 10)
scala> for(i <- arr) println(i)
2
4
6
8
10
废话不多说,直接上代码
scala> val arrStr = Array("a","bb","ccc","dddd")
arrStr: Array[String] = Array(a, bb, ccc, dddd)
scala> val arrInt = Array(3,2,4,1,5)
arrInt: Array[Int] = Array(3, 2, 4, 1, 5)
//求和
//泛型为字符串类型的数组不存在sum方法
scala> arrStr.sum
:13: error: could not find implicit value for parameter num: Numeric[St
ring]
arrStr.sum
^
//sum求和
scala> arrInt.sum
res13: Int = 15
//-----------------------------------------------------------------------------
//max和min,对于String类型的是比较字符串字符个数,数字类型的比较的是数值大小
scala> arrStr.max
res14: String = dddd
scala> arrInt.max
res15: Int = 5
//-----------------------------------------------------------------------------
//使用sortWith进行排序,可以自定义升序还是降序
//对于String类型的是比较字符串字符个数,数字类型的比较的是数值大小
scala> arrInt.sortWith(_>_)
res25: Array[Int] = Array(5, 4, 3, 2, 1)
scala> arrStr.sortWith(_>_)
res26: Array[String] = Array(dddd, ccc, bb, a)
//使用scala.util.Sorting.quickSort进行排序,但只能针对Array类型,不能针对ArrayBuffer
scala> scala.util.Sorting.quickSort(arrInt)
scala> arrInt
res28: Array[Int] = Array(1, 2, 3, 4, 5)
//ArrayBuffer不能使用scala.util.Sorting.quickSort
scala> val a = arrInt.toBuffer
a: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)
scala> scala.util.Sorting.quickSort(a)
:13: error: overloaded method value quickSort with alternatives:
[K](a: Array[K])(implicit evidence$1: scala.math.Ordering[K])Unit
(a: Array[Float])Unit
(a: Array[Int])Unit
//-----------------------------------------------------------------------------
//mkString,获取数组中的内容,并使用分隔符和前缀后缀
scala> arrInt
res35: Array[Int] = Array(1, 2, 3, 4, 5)
scala> arrInt.mkString
res36: String = 12345
scala> arrInt.mkString(",")
res37: String = 1,2,3,4,5
scala> arrInt.mkString("<",",",">")
res38: String = <1,2,3,4,5>
//-----------------------------------------------------------------------------
//toString就是调用的java中toString方法
scala> arrInt.toString
res39: String = [I@7c609e43//数组使用toString方法就是打印的这个鸟玩意(类型@哈希值)
//ArrayBuffer使用toString方法就能显示类型和内容
scala> arrInt.toBuffer.toString
res41: String = ArrayBuffer(1, 2, 3, 4, 5)