Scala 之数组

可变数组与不可变数组

scala 复制代码
import scala.collection.mutable.ArrayBuffer



  // 不可变数组。 长度不可变,但是元素的值可变
object Demo1 {


  def main(args: Array[String]): Unit = {

    // 不可变数组定义方式
    // 未初始化有默认值 Int  =>  0
    val  arr1 : Array[Int] = new Array[Int](5)
    val  arr2 : Array[Int] = Array(2,2,2,2,2)
    val  arr3 = Array(3,3,3,3,3)


    //  对元素值改变。不会创建新数组
    arr1(0) = 3
    arr1.update(4,5)
    println(arr1.mkString(","))


    //数组遍历
    for(i<- 0 until arr1.length)      println(arr1(1))
    for(ele <- arr1)                        println(ele)

    val iterator = arr1.iterator
    while(iterator.hasNext)    println(iterator.next())

    arr1.foreach(x => println(x))
    arr1.foreach(println(_))
    // 函数体只有一句,并且使用了已经存在函数,且参数是一一对应,那么此时参数列表可以省略
    arr1.foreach(println)

    //数组扩容   创建新数组。
    val r1 = arr1 :+ 9
    val r2 = arr1.+:(9)

    // +: 的: 要对着变量。否则就得 .+: 调用
    val r3 = 8 +: arr1 :+8 :+ 8

    println("---------------"+arr1.mkString("/"))
    println(r3.mkString("-"))

    //数组与数组的合并  ++ ++: :++ 产生新数组,都是在数组后拼接
    val v1 = arr1 ++ arr2
    val v2 = arr1.concat(arr3)
    //运行结果为  3|0|0|0|5|3|3|3|3|3   val v1 = arr1 ++ arr2 这里并不对arr1产生影响 。
    println(v2.mkString("|"))


    //创键范围内固定步长数组,含头不含尾
    val v3 =  Array.range(0,10,2)
    println(v3.mkString(","))

    //创建数组,并用指定逻辑产生的数据填充
    //   def fill(n: Int)(elem: => T): Array[T] = ???    柯理化函数  传名函数
    // ({})  这种形式, () 或 {} 可省略其一
    val v4 = Array.fill(6)({
      (Math.random() * 100).toInt
    })
    println(v4.mkString(","))

    // 数组翻转
    val v5 = v4.reverse
    println(v5.mkString(","))

    println("---------------------------------------------------------------------")


    //创建可变数组   是没有默认值的,必须初始化
    val a1 = new ArrayBuffer[Int]
    // 0
    println(a1.length)

    //a1(0) = 3   报错   0 is out of bounds (min 0, max -1)   数组无元素
    a1.+=(1)
    a1 += 1

    //指定初始长度, 但是也必须先 += 初始化元素 才可以 a2()访问
    val a2 = new ArrayBuffer[Int](3)

    val a3 =  ArrayBuffer[Int](3,3,3,3,3,3)

    println(a1)
    a1 += 2
    0 +=: a1
    a1.append(2)
    a1.prepend(0)
    println(a1)
    println(a3)

    val array1 =  ArrayBuffer(1, 1, 3, 3, 1, 1)
    array1.insert(1,2)
    array1.update(0,0)
    array1.remove(array1.length-1)

    // 删除第一个3
    array1 -= 3
    //ArrayBuffer(0, 2, 1, 3, 1)
    println(array1)

    // BufferArray 与 Array 的转换。  .toArray  .toBuffer

  }
}

练习:猴子报数。15只猴子围成一圈报数,报到数字7的猴子被淘汰,下一只猴子从1重新报数,最后剩余的是哪只猴子?

scala 复制代码
package com.fesco.array

object MonkeyExec {

  def main(args: Array[String]): Unit = {

    // 定义数组,表示15只猴子
    // 用true表示猴子的还活着,用false表示猴子被淘汰
    val monkeys = Array.fill(15)(true)
    // 定义变量来记录还剩余的猴子数量
    var n = 15
    // 定义变量来记录报数
    var i = 1
    // 定义变量来记录下标
    var index = 0
    // 只要剩余的猴子数量>1那么就需要继续报数
    while (n > 1) {
      // 先判断这只猴子是否存活
      if (monkeys(index)) {
        // 判断这只猴子是否会被淘汰
        if (i == 7) {
          // 这只猴子被淘汰
          monkeys(index) = false
          // 剩余猴子数量-1
          n -= 1
          // 下一只猴子重新报数
          i = 0
        }
        // 报数+1
        i += 1
      }
      // 下一只猴子准备
      index += 1
      if (index == monkeys.length) index = 0
    }
    println(monkeys.mkString(", "))
  }

}

二维数组

scala 复制代码
// 二维数组中的一维数组的长度可以不一致
val array1 = new Array[Array[Int]](3)
array1(0) = new Array[Int](5)
array1(1) = Array[Int](1, 2, 3, 4, 5)

//ofDim 方法可定义一至五维数组
// 二维数组,每个数组长度为5  。  这种方式定义的每个一维数组长度要一致
val array2 = Array.ofDim[Int](2, 5)

val array3 = Array(Array(1, 1, 1, 1, 1), Array(1, 1, 1, 1, 1), Array(1, 1, 1, 1, 1), Array(1, 1, 1, 1, 1), Array(1, 1, 1, 1, 1))

// 输出的不是1 ,而是 () 。 赋值运算符的返回值是Unit
// println(array3(0)(0) = 1)


//    杨辉三角形
//    1
//    1 1
//    1 2 1
//    1 3 3 1
//    1 4 5 4 1


val arr = new Array[Array[Int]](5)
// 遍历数组
for (i <- 0 until 5) {
  // 初始化第i行一维数组
  arr(i) = new Array[Int](i + 1)
  // 填充元素
  for (j <- 0 to i) {
    // 每一行第一个或者最后一个元素是1
    if (j == 0 || j == i) arr(i)(j) = 1
    else arr(i)(j) = arr(i - 1)(j) + arr(i - 1)(j - 1)
  }
  println(arr(i).mkString("\t"))
}
相关推荐
爱喝水的鱼丶2 分钟前
SAP-ABAP:SAP中的用户确认对话框:深入理解与实践POPUP_TO_CONFIRM
运维·开发语言·学习·sap·abap
徐小夕3 分钟前
花了4个月时间,我写了一款支持AI的协同Word文档编辑器
前端·vue.js·后端
小此方18 分钟前
C语言自定义变量类型结构体理论:从初见到精通(上)
c语言·开发语言
努力也学不会java24 分钟前
【Java并发】揭秘Lock体系 -- 深入理解ReentrantReadWriteLock
java·开发语言·python·机器学习
vxtkjzxt88837 分钟前
自动化脚本矩阵运营
开发语言·php
王严培.1 小时前
7.MATLAB疑难问题诊疗的技术
开发语言·matlab·信息可视化
花花无缺1 小时前
资源泄露问题
java·后端·http
wjs20241 小时前
PHP MySQL 使用 ORDER BY 排序查询
开发语言
爱敲代码的TOM1 小时前
深入剖析Java通信架构下的三种IO模式2
java·开发语言·架构
UWA2 小时前
Unreal开发痛点破解!GOT Online新功能:Lua全监控 + LLM内存可视化!
开发语言·lua·unreal