Scala从入门到放弃(三)Scala的数组、映射、元组和集合

摘要:
1.Array 1.1常量数组和可变长度数组对象ArrayDemo{defmain(args:Array[String]):Unit={//初始化长度为8的常量数组,其数组元素为0valarr1=newArray[Int](8)//直接打印常量数组,该数组的内容为数组的哈希代码值println(arr1)//将数组转换为数组缓冲区,您可以看到原始数组的内容//ToBuffer将数组转换成数组缓冲区

1.数组

1.1定长数组和变长数组

object ArrayDemo {
  def main(args: Array[String]): Unit = {
    //初始化一个长度为8的定长数组,其数组元素均为0
    val arr1 = new Array[Int](8)
    //直接打印定长数组,内容为数组的hashcode值
    println(arr1)
    //将数组转换成数组缓冲,就可以看到原数组中的内容了
    //toBuffer会将数组转成数组缓冲
    println(arr1.toBuffer)

    //注意:如果new ,相当于调用了数组的apply方法,直接为数组赋值
    //初始化一个长度为1的定长数组
    val arr2 = Array[Int](10)
    println(arr2.toBuffer)
    println(arr2(0)) //相当于只是填入了Array

    //定义一个长度为3的定长数组
    val arr3 =Array("hadoop","storm","spark")
    //使用()来访问元素
    println(arr3(1)) //运行结果:storm 下标从0开始


    println("==================变长数组=====================")

    val ab = ArrayBuffer[Int]()
    //向数组缓冲的尾部追加一个元素
    //+=尾部追加元素
    ab+=1
    //追加多个元素
    ab+=(2,3,4,5)
    //追加一个数组 ++=
    ab ++= Array(6,7)
    //追加一个数组缓冲
    ab ++=ArrayBuffer(8,9)

    //打印数组缓冲ab
    println(ab)
    //下标为 0~1之间插入 0
    ab.insert(1,0,3,5,7,9) //运行结果:在下标为1的位置插入0 3 5 7 9
    //删除数组某个位置的元素用remove 后面的2 为remove 下标为8  9 两个元素 游标
    ab.remove(8,2)
    println(ab)

  }

}

运行结果
image.png

1.2 遍历数组

  • 增强for循环
  • 好用的until会生成脚标, 0 until 10 包含0不包含10
    image.png
    println("==================遍历数组=====================")

    //初始化一个数组
    val array1 = Array(1,2,3,4,5,6,7,8)
    //增强for循环
    for (i <- array1)
      print(i+"	")
    println()

    //好用的until会生成一个Range
    //reverse是将前面生成的Range反转
    for (i <- (0 until array1.length).reverse)
      print(i+"	")

image.png

1.3 数组转换

yield 关键字将原始的数组进行转换会产生一个新的数组,原始的数组不变
image.png

object ArrayYieldDemo {
  def main(args: Array[String]): Unit = {
    //定义一个数组
    val arr =Array(1,2,3,4,5,6,7,8,9)
    //将偶数取出乘以10后再生成一个新的数组
    val res = for(e <- arr if e % 2==0 ) yield e * 10
    println(res.toBuffer)

    //更高级的写法,用着更爽
    //filter是过滤器,接受一个返回值boolean的函数
    //map相当于将数组中的每一个元素取出来,应用传进去的函数

    val r = arr.filter(_ % 2 ==0).map(_*10)
    println(r.toBuffer)
  }
}

image.png

1.4 常用数组的算法

在Scala中,数组上的某些方法对数组进行相应的操作非常方便!
image.png

2 映射(Map)

在Scala中,把哈希表这种数据结构叫做映射

2.1 构建映射

image.png

2.2 获取和修改映射中的值

image.png
好用的getorElse
image.png
注意:在Scala中,有两个Map,一个是immutable包下的Map,该Map中的内容不可变,另一个是mutable包下的Map,该Map中的内容可变

image.png
注意:通常我们在创建一个集合时会用val这个关键字修饰一个变量(相当于java中的final),那么就意味着变量的引用不可变,该引用的内容是不是可变的,取决于这个引用指向的集合的类型

2.3 将对偶的集合转换成映射

image.png

3 元组

映射是k/v对偶的集合,对偶是元组的最简单的形式,元组可以装着多个不同类型的值

3.1 创建元组

image.png

3.2 获取元组中的值

image.png

3.3拉链操作

zip命令可以将多个值绑定在一起(有点python 风~)
image.png
注意:如果两个数组的元素个数不一致,拉链操作后生成的数组的长度为较小的那个数组的元素的个数

4 集合

Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质
在Scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable 类型的集合初始化后就不能改变了(注意与val修饰的变量进行区分)

4.1 序列

不可变的序列 import scala.collection.immutable._
在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表
9::List(5,2)::操作符是将给定的头和尾创建一个新的列表
注意: ::操作符是右结合的,如9 ::5 ::2 ::Nil 相当于 9::(5::(2::Nil))

object ImmutListDemo {
  def main(args: Array[String]): Unit = {
    //创建一个不可变的集合
    val lst1 = List(1,2,3)
    //将0插入到lst1的前面生成一个新的list
    val lst2 = 0::lst1
    val lst3 = lst1.::(0)
    val lst4 = 0+:lst1
    val lst5 = lst1.+:(0)

    //将一个元素添加到lst1的后面产生一个新的集合
    val lst6 = lst1 :+3

    val lst0 = List(4,5,6)

    //将2个list合并成一个新的List
    val lst7 = lst1 ++ lst0

    //将lst1插入到lst0前面生成一个新的集合
    val lst8 = lst1 ++: lst0

    //将lst0插入到lst1前面生成一个新的集合
    val lst9 = lst1. :::(lst0)
    println(lst9)
  }

}

4.2 Set

4.3 Map

免责声明:文章转载自《Scala从入门到放弃(三)Scala的数组、映射、元组和集合》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇POJ NOI0113-04 垂直直方图(PKU2800)docker离线安装zabbix+grafana下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# Byte[]数组读取和写入文件

protected void ByteToString_Click(object sender, EventArgs e) { string content = this.txtContent.Text.ToString(); if (string.IsNullO...

D3、EChart、HighChart绘图demol

1.echarts:   <!DOCTYPE html>   <html>   <head>   <meta charset="utf-8">   <title>ECharts</title>   <!-- 引入 echarts.js -->...

vue中的一些用法,持续更新中......

1、跳转用法 @1、在template模板中通常使用router-link to='url' @2、在js中 1、this.$router.push({path: ''/order/index''}); 2、this.$router.push({path: '/order/page1',query:{ id:'2'}}); 3、this.$router...

Java常用类库与技巧

Java异常 异常处理机制主要回答了三个问题 What:异常类型回答了什么被抛出 Where:异常堆栈跟踪回答了在哪抛出 Why:异常信息回答了为什么被抛出 Java的异常体系 ​ Error和Exception的区别 从概念角度解析Java的异常处理机制: 1.Error:程序无法处理的系统处理,编辑器不做检查(如系统崩溃,虚拟机错误,内存空间不足,方法...

Yii2基本概念之——配置(Configurations)

在Yii中创建新对象或者初始化已经存在的对象广泛的使用配置,配置通常包含被创建对象的类名和一组将要赋值给对象的属性的初始值,这里的属性是Yii2的属性。还可以在对象的事件上绑定事件处理器,或者将行为附加到对象上。从而在定义了对象的初始值的同时,充分规定对象的运行时的动态特性。 以下代码中的配置被用来创建并初始化一个数据库连接: $config = [...

Scala 学习笔记之集合(6)

object CollectionDemo7 { def main(args: Array[String]): Unit = { //数组使用 val arr = Array("red", "blue", "yellow") arr(0) = "white" for(el <- arr){println(...