• Scala学习笔记(3)


    数组

    -----------------------------------

      0.若长度固定则用Array,若长度可能变化则使用ArrayBuffer

      1.提供初始值的时候不要使用new。

      2.用()来访问元素

      3.使用for(elem<-arr)来遍历元素

      4.用for(elem<- arr if ....)...yield...来将原数组转换成新数组

      5.Scala数组和java数组可以互操作;用ArrayBuffer,使用scala.collection.JavaConversions中的转换函数。

      1.定长数组

        (1)如果需要一个长度不变的一个数组,可以用Array

          val nums = new Array[Int](10)  //10个整数的数组,将所有元素初始化为0

          val a = new Array[String](10)  //10个字符串数组,所有元素初始化都为null

          val s = Array("Hello","World")  //长度为2的Array[String]----类型是推断出来的

                        //说明:已经提供初始值就不需要new

          s(0) = "Goodbye"      //Array("Goodbye","World"),使用()而不是[]来访问元素

      2.边长数组:数组缓冲。对于长度按照需要变化的数组,java有ArrayList。Scala中有ArrayBuffer

        

    import scala.collection.mutable.ArrayBuffer
    val b = ArrayBuffer[Int]()    //或者new ArrayBuffer[Int],一个空的数组缓冲,用于存放整数
    b+=1    //ArrayBuufer(1),用+=在尾端添加元素
    b+=(1,2,3,5)    //ArrayBuffer(1,1,2,3,5),在尾端添加多个元素,用括号括起来
    b++=Array(8,13,21)    //ArrayBuffer(1,1,2,3,5,8,13,21),可以用++=操作符追加任何集合
    b.timeEnd(5)        //ArrayBuffer(1,1,2),移除后面5个元素

      在数组尾部添加或者溢出元素是比较高效的操作,也可以在任意位置插入或者移除元素,但是这样就没有那么高效了,所有在那个之后的元素都必须被平移。如:

    b.insert(2,6)    //ArrayBuffer(1,1,6,2),这是在下标2之前进行插入6操作
    b.insert(2,7,8,9)    //ArrayBuffer(1,1,7,8,9,6,2),可以插入任意多的元素
    b.remove(2)    //Array(1,1,8,9,6,2),移除下标为2上的元素
    b.remove(2,3)    //ArrayBuffer(1,1,2),第二个参数是要移除多少个元素

    有的时候需要构建一个Array,但是不知道最终需要装进去多少个元素。在这种情况下先构建一个缓冲数组,然后调用:b.toArray

    3.遍历数组和数组缓冲

    for(i<-0 until a.length)
        println(i+":"+a(i))    //这个地方变量i的取值范围是从0到a.length-1.until是RichInt类的方法,返回所有小于(但是不包括)上限的数组
      如 0 until 10 //Range(0,1,2,3,4,5,6,7,8,9)

      如果想要每两个元素一条,可以让i这样进行遍历

      

    //如果想要每两个元素一跳,可以这样遍历
    0 until (a.length,2)    //Range(0,2,4...)
    //如果要从数组尾端开始,遍历方法如下:
    (0 until a.length).reverse     //Range(...,2,1,0)
    //如果在循环体中不需要用到数组下标,可以直接这样访问数组
    for(elem <- a)
        println(elem)

    //定长数组的操作

    var arr= new Array[Int](10);    //创建一个定长数组,元素都为0
    arr = Array(1,2,3)    //将arr中的0,1,2号位置上的0,0,0换成1,2,3
    arr(0)    //取出第一个位置上的元素

    //边长数组操作

    import scala.collection.mutable.ArrayBuffer    //先进行导包操作
    var buf = ArrayBuffer[Int]()                        //创建数组缓冲区对象

    //溢出末尾两个元素

    buf.trimEnd(2)    //移除末尾两个元素
    buf.trimStart(2)    //移除开始两个元素

    //yield  产生新值

    val a = Array(2,3,5,7,11)
    val result = for(elem<- a) yield 2* elem    //产生result是(4,6,10,14,22)

    //守卫条件

    //  返回大于5的偶数,类型为Vector
    val items = for(i <- 1 to 10 if i % 2 == 0 if i > 5) yield i;

    5.常用的算法

    Array(1,7,2,9).sum    //19    对ArrayBuffer同样适用,使用sum方法,元素类型必须是数值类型:要么是整数,要么是浮点型或者BigInteger/BigDecimal
    ArrayBuffer("Mary","had","a","little","lamb").max    //返回little,max和min输出数组或者数组缓冲区中最大或者最小的元素

    //sorted()方法

    val b = ArrayBuffer(1,7,2,9)
    val bSorted = b.sourted(_<_)    //ArrayBuffer(1,7,2,9)
    
    val bsorted=b.sorted(_>_)    //ArrayBuffer(9,7,2,1)

    //可以直接对一个数组进行排序,但是不能对缓冲区进行排序

    val a =Array(1,7,2,9)
    scala.util.Sorting.quickSort(a)    // Array(1,2,7,9)
    //如果想要显示数组或者缓冲区的内容,可以使用mkString方法,允许在指定的元素之间的分隔符
    a.mkString("and" )    //"1 and 2 and 7 and 9"
    a.mkString("<",",",">")    //"<1,2,7,9>"
    
    //相对于toString相比:
        a.toString    //这是java的方法,毫无意义
        b.toString    //"ArrayBuffer(1,7,2,9)"
    

      7.多维数组

      和java一样,多维数组是通过数组的数组来实现的。如Double的二维数组类型为Array[Array[Double]],构造这样的一个数组可以用ofDim方法:  var matrix=Array.ofDim[Double]{3,4}  //定义一个3行4列的二维数组

      要访问其中的元素,使用两对圆括号:matrix(row)(column)=42

      8.与java的互操作,导入转换类,使用的是隐式转换,

      scala>import scala.collection.javaConversions.bufferAsJavaList

      而要访问其中的元素,每一行的长度不相同

  • 相关阅读:
    .net 文件夹是否存在的判断
    Lock Statement And Thread Synchronization
    如何利用EnteLib Unity Interception Extension 和PIAB实现Transaction
    OSQL 命令行工具
    How to build tab sets whitch headers display at bottom in WPF?
    Monitoring Clipboard Activity in C#
    产品经理讲座的感悟
    图说
    解决技术问题的9点建议
    为啥要整理需求?
  • 原文地址:https://www.cnblogs.com/bigdata-stone/p/9638410.html
Copyright © 2020-2023  润新知