1 数组-定长数组(声明泛型)
第一种方式定义数组
这里的数组等同于Java中的数组,中括号的类型就是数组的类型
val arr1 = new Array[Int](10) //赋值,集合元素采用小括号访问 arr1(1) = 7
val arr01 = new Array[Int](4) println(arr01.length) println("arr01(0)=" + arr01(0)) for (i <- arr01) { println(i) } println("--------------------") arr01(3) = 10 for (i <- arr01) { println(i) }
第二种方式定义数组
在定义数组时,直接赋值
//使用apply方法创建数组对象
val arr1 = Array(1, 2)
2 数组-变长数组(声明泛型)
基本使用和应用案例
//定义/声明 val arr2 = ArrayBuffer[Int]() //追加值/元素 arr2.append(7) //重新赋值 arr2(0) = 7 //学习集合的流程(创建,查询,修改,删除)
val arr01 = ArrayBuffer[Any](3, 2, 5) println("arr01(1)=" + arr01(1)) for (i <- arr01) { println(i) } println(arr01.length) //? println("arr01.hash=" + arr01.hashCode()) arr01.append(90.0,13) println("arr01.hash=" + arr01.hashCode()) arr01(1) = 89 //修改 println("--------------------------") for (i <- arr01) { println(i) } //删除 arr01.remove(0) println("--------------------------") for (i <- arr01) { println(i) } println("最新的长度=" + arr01.length)
变长数组分析小结
1)ArrayBuffer是变长数组,类似java的ArrayList
2)val arr2 = ArrayBuffer[Int]() 也是使用的apply方法构建对象
3)def append(elems: A*) { appendAll(elems) } 接收的是可变参数.
4)每append一次,arr在底层会重新分配空间,进行扩容,arr2的内存地址会发生变化,也就成为新的ArrayBuffer
定长数组与变长数组的转换
arr1.toBuffer //定长数组转可变数组
arr2.toArray //可变数组转定长数组
1)arr2.toArray 返回结果才是一个定长数组, arr2本身没有变化
2)arr1.toBuffer返回结果才是一个可变数组, arr1本身没有变化
val arr2 = ArrayBuffer[Int]() // 追加值 arr2.append(1, 2, 3) println(arr2) val newArr = arr2.toArray; println(newArr) val newArr2 = newArr.toBuffer newArr2.append(123) println(newArr2)
3 数组-多维数组
多维数组的定义和使用
说明
//定义 val arr = Array.ofDim[Double](3,4) //说明:二维数组中有三个一维数组,每个一维数组中有四个元素 //赋值 arr(1)(1) = 11.11
val array1 = Array.ofDim[Int](3, 4) array1(1)(1) = 9 for (item <- array1) { for (item2 <- item) { print(item2 + "\t") } println() } println("===================") for (i <- 0 to array1.length - 1) { for (j <- 0 to array1(i).length - 1) { printf("arr[%d][%d]=%d\t", i, j, array1(i)(j)) } println() }
4 数组-Scala数组与Java的List的互转
Scala数组转Java的List
// Scala集合和Java集合互相转换 val arr = ArrayBuffer("1", "2", "3") import scala.collection.JavaConversions.bufferAsJavaList val javaArr = new ProcessBuilder(arr) //为什么可以这样使用? val arrList = javaArr.command() println(arrList) //输出 [1, 2, 3]
补充: trait MyTrait01 {} class A extends MyTrait01 {} object B { def test(m: MyTrait01): Unit = { println("b ok..") } } //明确一个知识点 //当一个类继承了一个trait //那么该类的实例,就可以传递给这个trait引用 val a01 = new A B.test(a01)
Java的List转Scala数组(mutable.Buffer)
在项目开发中,有时我们需要将Java的List转成Scala数组,看下面案例:
import scala.collection.JavaConversions.asScalaBuffer import scala.collection.mutable // java.util.List ==> Buffer val scalaArr: mutable.Buffer[String] = arrList scalaArr.append("jack") println(scalaArr)
实例一:
package com.atguigu.scala.chapter07 /** * Author: Felix * Date: 2020/5/4 * Desc: 不可变数组 * 不可变数组,所以在执行添加或者删除操作的时候,会创建新的数组对象 */ object Scala01_TestArray { def main(args: Array[String]): Unit = { //创建不可变数组 方式1 val arr: Array[Int] = new Array[Int](5) //创建不可变数组 方式2 //val arr: Array[Int] = Array(1,2,3,4,5) //访问数组中的元素 并修改数组中的元素 arr(1) = 10 arr.update(1,20) //println(arr(1)) //遍历数组中的元素 /* //方式1:普通的for循环 for(i <- 0 until arr.length){ println(arr(i)) } ` //方式2:普通的for循环 // for( elem:Int <- arr){ for( elem <- arr){ println(elem) } //方式3:迭代器 val it: Iterator[Int] = arr.iterator //while(it.hasNext){ // println(it.next()) //} for (elem <- it) { println(elem) } //方式4:增强for循环 foreach的参数是一个和函数,是对当前集合中的元素的具体操作 //arr.foreach((elem:Int)=>{println(elem)}) //arr.foreach(println(_)) arr.foreach(println) */ //方式5: 用指定的字符串连接数组中的元素,形成一个新的字符串 //println(arr.mkString("--")) //向数组中添加元素 //因为Array是不可变数组,所以在执行添加操作的时候,会创建新的数组对象 //val newArr: Array[Int] = arr. +: (30) //在Scala语言中,如果运算符方法中包含冒号,并且冒号在后,运算顺序为从右到左 //val newArr: Array[Int] = arr +: 30 编译报错 val newArr: Array[Int] = 30 +: arr //val newArr: Array[Int] = arr. :+ (20) //val newArr: Array[Int] = arr :+ 20 println(arr.mkString("--")) println(newArr.mkString("--")) } }
实例二:
package com.atguigu.scala.chapter07 import scala.collection.mutable import scala.collection.mutable.ArrayBuffer /** * Author: Felix * Date: 2020/5/4 * Desc: 可变数组 * 可变数组,在执行添加或者删除操作的时候,不会创建新的数组对象,直接在源数组上进行操作 */ object Scala02_TestArrayBuffer { def main(args: Array[String]): Unit = { //创建可变数组 //val arr: ArrayBuffer[Int] = new ArrayBuffer[Int]() //val arr: ArrayBuffer[Int] = ArrayBuffer(1,2,3) //访问数组中的元素 对数组中的元素进行修改 //arr(1) = 20 //arr.update(1,30) //println(arr(1)) //向数组中添加元素 建议:在操作集合的时候,不可变用符号,可变用方法 //val newArr = arr. += (20) //arr.append(30) //arr.insert(1,50) //注意:并不是数组是可变的,在操作数组对象的时候,就不能创建新的数组对象了。 也可以调用相关的方法,去创建新的对象 //val newArr: ArrayBuffer[Int] = arr.+:(30) //println(arr.mkString(",")) //println(newArr.mkString(",")) //删除数组中的元素 //val num: Int = arr.remove(1) //println(num) //arr.remove(1,2) //println(arr.mkString(",")) //可变数组转换为不可变数组 val arr: ArrayBuffer[Int] = ArrayBuffer(1,2,3) val newArr: Array[Int] = arr.toArray //不可变数组转换为可变数组 val buffer: mutable.Buffer[Int] = newArr.toBuffer } }
实例三:
package com.atguigu.scala.chapter07 /** * Author: Felix * Date: 2020/5/4 * Desc: 多维数组 */ object Scala03_TestMulArray { def main(args: Array[String]): Unit = { //创建二维数组 val arr: Array[Array[Int]] = Array.ofDim[Int](2,3) arr(1)(0) = 20 //对二维数组进行遍历 for ( i <- 0 until arr.length;j <- 0 until(arr(i).length)){ println(arr(i)(j)) } //创建五维数组 val newArrr: Array[Array[Array[Array[Array[Int]]]]] = Array.ofDim[Int](2,3,4,5,6) } }