数组的分类
*     可变数组(Array)、不可变数组(ArrayBuffer)
可变&不可变
*     说明
*        可变 : 长度可变,添加或删除元素后,原对象改变
*      不可变 : 长度不可变,添加或删除后,原对象不改变
*
不可变数组 - Array
*     声明
*        1. 通过类 创建
*           var arr:Array[Int] = new Array[Int](10)
*        2. 通过 伴生对象的apply返回对象
*           var arr1 = Array.apply(10, 1, 2)
*           简写  var arr1 = Array(10, 1, 2)
*
*     获取数组长度 arr.length
*
*     修改元素
*         arr1(0) = 99
*         arr1.update(1, 88)
*
*     打印数组 返回 String,指定分割符
*         println(arr1.mkString(","))
*
*     遍历数组
*       for遍历
*         示例  for (ele <- arr1) println(ele)
*       foreach遍历 + 匿名函数
*         示例  arr1.foreach(println)
*
*     增加元素(返回新数组,不改变元素组)
*         尾部添加
*            示例 var arr3: Array[Int] = arr1 :+ 5   //底层调用appended方法
*            示例 var arr3_1: Array[Int] = arr1.appended(5)
*         头部添加
*            示例 var arr4 = 5 +: arr1 //底层调用prepended方法
*            示例 var arr4_1 = arr.prepended(5)
*
可变数组 - ArrayBuffer
*     导包 scala.collection.mutable.ArrayBuffer
*
*     声明
*         1. 通过 伴生对象的apply返回对象
*            示例   var arr1 = ArrayBuffer[Int](1, 2, 3)
*
*     增加元素(返回原数组指针,改变原数组)
*        尾部添加
*           示例  arr1.append(10)  //底层调用addOne(elem) 方法
*                arr1.append(10).append(6) //连续添加
*           示例  arr1 += 9       //底层调用addOne(elem) 方法
*        头部添加
*           示例  arr1.prepend(10)
*                9 +=: arr1      //底层调用prepend方法
*        指定位置添加 (返回类型Unit)
*           示例  arr1.insert(1, 22)
*
*    修改元素
*       示例 arr1(1) = 111
*       示例 arr1.update(2, 222)
*
可变数组与不可变数组的转换 (返回新对象,原数组不变)
*       Array -> ArrayBuffer
*          语法
*             var arr2Buffer = arr.toBuffer
*       ArrayBuffer -> Array
*          语法
*             var buffer2arr = arrBuffer.toArray
*
多维数组 (数组的元素是数组)
*       声明
*          示例 var dimArr = Array.ofDim[Int](3, 4)
*
import scala.collection.mutable.ArrayBuffer
/**
  * @author gaocun
  * @create 2021-10-28 5:48 PM */
object Array_01 {
  /*
  *  数组的分类
  *     可变数组(Array)、不可变数组(ArrayBuffer)
  *  可变&不可变
  *     说明
  *        可变 : 长度可变,添加或删除元素后,原对象改变
  *      不可变 : 长度不可变,添加或删除后,原对象不改变
  *
  *  不可变数组 - Array
  *     声明
  *        1. 通过类 创建
  *           var arr:Array[Int] = new Array[Int](10)
  *        2. 通过 伴生对象的apply返回对象
  *           var arr1 = Array.apply(10, 1, 2)
  *           简写  var arr1 = Array(10, 1, 2)
  *
  *     获取数组长度 arr.length
  *
  *     修改元素
  *         arr1(0) = 99
  *         arr1.update(1, 88)
  *
  *     打印数组 返回 String,指定分割符
  *         println(arr1.mkString(","))
  *
  *     遍历数组
  *       for遍历
  *         示例  for (ele <- arr1) println(ele)
  *       foreach遍历 + 匿名函数
  *         示例  arr1.foreach(println)
  *
  *     增加元素(返回新数组,不改变元素组)
  *         尾部添加
  *            示例 var arr3: Array[Int] = arr1 :+ 5   //底层调用appended方法
  *            示例 var arr3_1: Array[Int] = arr1.appended(5)
  *         头部添加
  *            示例 var arr4 = 5 +: arr1 //底层调用prepended方法
  *            示例 var arr4_1 = arr.prepended(5)
  *
  *  可变数组 - ArrayBuffer
  *     导包 scala.collection.mutable.ArrayBuffer
  *
  *     声明
  *         1. 通过 伴生对象的apply返回对象
  *            示例   var arr1 = ArrayBuffer[Int](1, 2, 3)
  *
  *     增加元素(返回原数组指针,改变原数组)
  *        尾部添加
  *           示例  arr1.append(10)  //底层调用addOne(elem) 方法
  *                arr1.append(10).append(6) //连续添加
  *           示例  arr1 += 9       //底层调用addOne(elem) 方法
  *        头部添加
  *           示例  arr1.prepend(10)
  *                9 +=: arr1      //底层调用prepend方法
  *        指定位置添加 (返回类型Unit)
  *           示例  arr1.insert(1, 22)
  *
  *    修改元素
  *       示例 arr1(1) = 111
  *       示例 arr1.update(2, 222)
  *
  *    可变数组与不可变数组的转换 (返回新对象,原数组不变)
  *       Array -> ArrayBuffer
  *          语法
  *             var arr2Buffer = arr.toBuffer
  *       ArrayBuffer -> Array
  *          语法
  *             var buffer2arr = arrBuffer.toArray
  *
  *    多维数组 (数组的元素是数组)
  *       声明
  *          示例 var dimArr = Array.ofDim[Int](3, 4)
  *
  * */
}
//不可变数组 - 长度不可变
object ArrayTest extends App {
  // 1.定义 - 通过new 对象创建
  var arr: Array[Int] = new Array[Int](10)
  // 2.定义2 - 通过伴生对象的apply方法创建
  var arr1 = Array.apply(10, 1, 2)
  // 3.获取数组长度
  var size: Int = arr.length
  println("数组长度 - " + size)
  // 4.修改元素
  arr1(0) = 99
  arr1.update(1, 88)
  println(arr1.mkString(","))
  // 5.打印数组
  println(arr1.mkString(","))
  // 6.遍历数组
  //for遍历
  for (ele <- arr1) println(ele)
  //foreach遍历
  def show(x: Int) = println(x)
  arr1.foreach(show)
  arr1.foreach(println)
  // 7.增加元素
  println(arr1.mkString("-"))
  arr1 :+ 5
  // 尾部添加,返回新数组
  var arr3: Array[Int] = arr1 :+ 5
  var arr3_1: Array[Int] = arr1.appended(5)
  println(arr1.mkString("-"))
  println(arr3.mkString("-"))
  // 头部添加,返回新数组
  var arr4 = 5 +: arr1
  var arr4_1 = arr.prepended(5)
  println(arr4.mkString(","))
}
//可变数组
object ArrayBufferTest extends App {
  // 定义数组 - 必须导包
  var arr1 = ArrayBuffer[Int](1, 2, 3)
  // 打印数组
  println(arr1.mkString(","))
  // 遍历数组
  for (e <- arr1) println(e)
  // 添加元素
  // 尾部添加
  arr1.append(10)
  arr1.append(10).append(6) //连续添加
  arr1 += 9
  arr1 += 88 + 66 // 连续添加
  println(arr1.mkString("-"))
  //头部添加
  9 +=: arr1
  arr1.prepend(10)
  println(arr1.mkString("-"))
  //指定位置添加
  var arr6 = arr1.insert(1, 22)
  println(arr6)
  // 修改元素
  arr1(1) = 111
  arr1.update(2, 222)
  println(arr1.mkString("-"))
}
//可变数组与不可变数组的转换
object ArrayToArrayBufferTest extends App {
  // 定义不可变数组
  var arr = Array(1, 2, 3)
  println(arr.getClass)
  // 定义可变数组
  var arrBuffer = ArrayBuffer(1, 2, 3)
  println(arrBuffer.getClass)
  // Array -> ArrayBuffer // 返回新对象 ArrayBuffer ,原数组不变
  var arr2Buffer = arr.toBuffer
  println(arr.getClass)
  println(arr2Buffer.getClass)
  // ArrayBuffer -> Array // 返回新对象 Array ,原数组不变
  var buffer2arr = arrBuffer.toArray
  println(arrBuffer.getClass)
  println(buffer2arr.getClass)
}
//多维数组
object DimArrayTest extends App {
  //定义 n1 = 行数, n2 = 列数
  var dimArr = Array.ofDim[Int](3, 4)
  //添加元素
  dimArr(0)(0) = 1
  dimArr(0)(1) = 2
  dimArr(0)(2) = 3
  dimArr(0)(3) = 4
  dimArr(1) = Array(5, 6, 7, 8)
  dimArr(2) = Array(9, 10, 11, 12)
  //遍历数组
  for (arr <- dimArr) {
    for (e <- arr) {
      print(e + " ")
    }
    println()
  }
  //打印数组
  def show(e: Array[Int]) = println(e.mkString(","))
  dimArr.foreach(show)
  dimArr.foreach((e: Array[Int]) => println(e.mkString(",")))
  dimArr.foreach(e => println(e.mkString(","))) //匿名函数
}