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"))
}
相关推荐
virus59457 小时前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
初次见面我叫泰隆8 小时前
Qt——3、常用控件
开发语言·qt·客户端
计算机毕设VX:Fegn08958 小时前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
没差c9 小时前
springboot集成flyway
java·spring boot·后端
三水不滴9 小时前
Redis 过期删除与内存淘汰机制
数据库·经验分享·redis·笔记·后端·缓存
无小道9 小时前
Qt——QWidget
开发语言·qt
时艰.9 小时前
Java 并发编程之 CAS 与 Atomic 原子操作类
java·开发语言
梵刹古音9 小时前
【C语言】 函数基础与定义
c语言·开发语言·算法
笨蛋不要掉眼泪9 小时前
Spring Boot集成LangChain4j:与大模型对话的极速入门
java·人工智能·后端·spring·langchain
梵刹古音9 小时前
【C语言】 结构化编程与选择结构
c语言·开发语言·嵌入式