zoukankan      html  css  js  c++  java
  • Scala从入门到放弃(三)Scala的数组、映射、元组和集合

    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

  • 相关阅读:
    java编程规范
    Servlet生命周期
    BBS
    Hibernate主键自增策略
    MyBatis举例以及连接数据库过程
    myBatis框架的配置部分
    持续集成
    2017-02-23 .NET Core Tools转向使用MSBuild项目格式
    记录表TABLE中 INDEX BY BINARY_INTEGER 的作用
    什么是 BIND 变量?
  • 原文地址:https://www.cnblogs.com/shine-rainbow/p/11335995.html
Copyright © 2011-2022 走看看