• Scala学习三——数组相关操作


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

      固定长度数组:

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

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

      变长数组:

        ArrayBuffer(相当于Java中的ArrayList)

    import scala.collection.mutable.ArrayBuffer
    val b=ArrayBuffer[Int]()
    //或者new ArrayBuffer[Int]
    //一个空的数组缓冲,准备存放整数
    b+=1
    //ArrayBuffer(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.trimEnd(5)
    //ArrayBuffer(1,1,2)
    //移除最后5个元素
    //可以在任意位置插入和移除元素,但是不高效
    b.insert(2,6)
    //ArrayBuffer(1,1,6,2)
    //在下标2之前插入
    b.insert(2,7,8,9)
    //ArrayBuffer(11,7,8,9,6,2)
    //可以插入任意多的元素
    b.remove(2)
    //ArrayBuffer(1,1,8,9,6,2)
    b.remove(2,3)
    //ArrayBuffer(1,1,2)
    //第二个参数的含义是移除多少个元素
    b.toArray()//数组缓冲转换为固定长度数组
    a.toBuffer()//固定长度转换为数组缓冲

    二.提供初始值时不要使用new

      val s=Array("Hello","World")长度为2的Array(String),已经提供初始值就不需要new

    三.用()来访问元素

      注意使用()来访问元素,而不是[]

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

      for(i<- 0 until a.length)...:util是RichInt类的方法,返回所有小于(不包括)上限的数字(o until 10实际调用的是0.until(10))。

      每两个元素一跳(0 util (a.length,2));

      从数组尾端开始:(0 until a.length).reverse;

      如果在循环体中不需要用到数组下标,直接访问元素for(elem<-a)

    五.用for(elem<-arr if...)...yiels...来将原数组转型为新数组

      例子:

        

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

      注:for(...)yield创建的是一个类型与原始集合相同的新集合;

        常用算法,Array(1,2,3).sum/min/max,Array(22,4,5,1).sorted(_<_)[从小到大],Array(22,4,5,1).sorted(_>_)[从大到小]    

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

      多维数组创建:

        val matrix=Array.ofDim[Double](3,5)//三行四列

      使用scala.collection.JavaConversions转换案例:

      

    七.练习

       

      

       1.

     import scala.util.Random
     def main (args: Array[String]) {
        createArr(10).foreach(println)
    }
     def createArr(n:Int):Array[Int]={
            val arr=new Array[Int](n)
            val rand=new Random()
            for(ele <- arr)
            yield rand.nextInt(n)
        }

      2.

      def main(args: Array[String]) = {
        val arr=Array(1,2,3,4,5)
        swap(arr)
        arr.foreach(print)
    
      }
      def swap(arr:Array[Int]):Unit={
        for(i<-0 until(arr.length-1,2)){
          val tmp=arr(i)
          arr(i)=arr(i+1)
          arr(i+1)=tmp
        }

      3.

    def main(args: Array[String]) = {
        val arr1 = Array(1, 2, 3, 4, 5)
        val arr2 = swapByYield(arr1)
        arr2.foreach(print)
      }
    
      def swapByYield(arrs: Array[Int]) = {
        for (i <- 0 until arrs.length) yield {
          if (i < arrs.length - 1 && i % 2 == 0) {
            val tmp = arrs(i)
            arrs(i) = arrs(i + 1)
            arrs(i + 1) = tmp
          }
        }
        arrs
      }

      4.

    def main(args: Array[String]) = {
        val a = Array(1, -2, 0, -3, 1, 2)
        val b = sigArr(a)
        b.foreach(println)
      }
    
      def sigArr(arr: Array[Int]) = {
        val buff = new ArrayBuffer[Int]()
        buff ++= (for (i <- arr if i > 0) yield i)
        buff ++= (for (i <- arr if i == 0) yield i)
        buff ++= (for (i <- arr if i < 0) yield i)
        buff.toArray
      }

      5.

     def main(args: Array[String]) = {
        val a = Array[Double](1, 4, 2, 10, 3, -1, -3)
        val b = Avgarr(a)
        println(b)
      }
    
      def Avgarr(arr: Array[Double]) = {
        arr.sum / arr.length
      }

      6.

      def main(args: Array[String]): Unit = {
        val arr1 = Array(5, 4, 3, 2, 1)
        reverseArray(arr1)
        arr1.foreach(print)
        print("
    ")
        val arr2 = ArrayBuffer(5, 4, 3, 2, 1)
        reverseArrayBuffer(arr2).foreach(print)
      }
    
      /**
       * Array反序排列(注:Array长度不可变)
       *
       * @param arr
       */
      def reverseArray(arr: Array[Int]) = {
        for (i <- 0 until arr.length / 2) {
          val tmp = arr(i)
          arr(i) = arr(arr.length - 1 - i)
          arr(arr.length - 1 - i) = tmp
        }
      }
    
      def reverseArrayBuffer(arr: ArrayBuffer[Int]) = {
        val reverseArr = ArrayBuffer[Int]()
        reverseArr++= arr.reverse
        reverseArr
      } 

      7.

    def main(args: Array[String]): Unit = {
        val arr1=ArrayBuffer(1,2,3,3,4,4,5,1,6,7)
        val arr2=ArrayBuffer[Int]()
        arr2++=arr1.distinct
        arr2.foreach(print)
      }

      8.

    def main(args: Array[String]): Unit = {
        val arr=Array(-1,2,3,-4,-5)
        val arr2=proResult(arr)
        arr2.foreach(print)
      }
      def proResult(arr:Array[Int])={
        val indexs=for(i <- 0 until arr.length if arr(i)<0) yield i
        val afterDropIndexs=indexs.reverse.dropRight(1)
        val tmp=arr.toBuffer
        for(i<-afterDropIndexs) tmp.remove(i)
        tmp
      }

      9.

     def main(args: Array[String]): Unit = {
        val arr=timeTone
        arr.foreach(print)
      }
      def timeTone={
        val arr=java.util.TimeZone.getAvailableIDs()
        val tmp=for(i<-arr if i.startsWith("America/")) yield{i.drop("America/".length)}
        scala.util.Sorting.quickSort(tmp)
        tmp
      }

      10.

    def main(args: Array[String]): Unit = {
        val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap]
        println(flavors.getClass.getSimpleName)
      }

     

  • 相关阅读:
    JavaScript脚本学习
    PE文件结构 (转贴)
    Squid 代理服务器 编译源码 伪造HTTP_X_FORWARDED_FOR 请求头
    设置win2003远程桌面允许2个以上会话
    2003远程桌面声音问题
    AS3正则表达式
    Visual Studio技巧之打造拥有自己标识的代码模板
    如何重建sql数据库索引
    多线程系列(转)
    时间差
  • 原文地址:https://www.cnblogs.com/lyq-biu/p/11943134.html
Copyright © 2020-2023  润新知