Scala学习笔记(三):数组相关操作

3.1定长数据

       val nums= new Array[int] (10)            //数组长度10,所有元素初始化为0

       val a=new Array[String] (10)               //数组长度10,所有元素初始化为null

       val s=Array("Hello","word")                //已提供初始值就不需要new

       s(0)="Goodbye"                                 //使用()来访问元素

3.2 变长数组:数组缓冲

       对于那种长度按需要变化的数组,java有ArrayList ,Scala中等效数据结构为ArrayBuffer

         import  scala.collection.mutable.ArrayBuffer

         var b=ArrayBuffer[int]()       //一个空的数组缓冲,准备存放int类型数据

         b+=1             //用+=在尾端添加元素

         b+=(1,2.3,4)

         b++=Array(12,12,13)         //使用++=添加集合

         b.trimEnd(5)    //移除b中最后5个元素

       在数组尾端添加移除袁术是最高效的,也可以在任意位置添加移除,但效率不高,所有在那个元素之后的元素都需要平移

        b.insert(2,6)         //在下标2之前插入6

        b.insert(2,7,8,9)    //在下标2之前插入7,8,9)

        b.remove(2)          //移除下标为2的元素

        b.remove(2,3)       //从下标为2的元素开始,移除3个元素

       数据和数组缓冲都可以相互转换:a. toBuffer, b.toArray等。

3.3遍历数组和数组缓冲

     for( i < - 区间)例如: for( i <- 0 util a.length) {        逻辑        }

      如果想使用两个元素一跳,可以这些写0 util (a.length,2)       //Rang(0,2,4....)

      如果要数组的尾端开始 (0 Until a.length).reverse

3.4 数组转换

        通过数组转换,可以在保持原数组不变的前提下,生产一个新的数组

        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 循环创造了一个新数组,数组缓冲ArrayBuffer也可以使用这种方式得到一个新的数组缓冲

        一般处理集合时,我们只处理满足条件的元素,这个需求可以通过守卫:for中的if来实现。

         for( elem<- a if elem% 2==0) yield elem*2     //原始集合并没有收影响。

         也可以采取另外一种写法 a.filter(_%2==0).map(2*_)或者 a.filter{_%2==0}.map(2*_)

3.5 常用算法

        1.sum方法元素类型必须是整型,比如Array(1,2,3).sum

        2. min,max求最小最大值

        3. sorted方法用于对数组进行排序返回一个新的数组或者数组缓冲(ArrayBuffer),这个过程不会修改原始数组

        4.你还可以提供一个比较函数,不过你需要使用sortWith方法

           val bDesc=b.sortWith(_>_)     

        注意:你可以对一个数组进行排序,但不能对数组缓冲进行排序

        val a=Array(1,7,2,9)

         scals.util.Sorting.quickSort(a)

       对应min,max,quickSort方法,元素类型必须支持比较操作,这包括了数字,字符串以及其它带有order特质的类型。

     最后,显示数组和数组缓冲的内容可以用mkString方法,它允许指定元素之间的分隔符。

       a.mkString(" and ")           // " 1 and 2  and 3"

       a.mkString("<",",",">")       // "<1,2,7,9>"

3.6解读Scaladoc

   查看36页

3.7多维数组

   Double二维数组的类型为Array[Array[Double]], 可以用ofDim方法构造二维数组

   var matrix=Array.ofDim[Double](3.4)    //三行、四列

   要访问其中的元素

    matrix(row)(column)=42

    当然还可以创建不规则数组,没一行的长度个不相同。

3.8 与JAVA互操作

    由于Scala数组是用java数组实现的,所以他们之间可以来回切换

    举例来说:java.lang.ProcessBuilder类有一个List<String>为参数的构造器,以下是在Scala中调用它的写法

     import scala.collection.JavaConversions.bufferAsJavaList

     import scala.collection.mutable.ArrayBuffer

     varl command=ArrayBuffer("ls","-al")

     val  pb=new ProcessBulider(command)     //Scala到java转换

     Scala的ArraryBuffer被包装成一个实现了java.util.List接口的Java类对象。

     反过来,当Java方法返回java.util.List时,我们可以让他自动转换为一个Buffer

     import scala.collection.JavaConversions.asScalaBuffer

     import scala.collection.mutable.Buffer

     val cmd:Buffer[String]=pb.command()   //java转到scala,不能使用ArrayBuffer------包装起来的对象仅能保证是个Buffer.

    

   

     

  

猜你喜欢

转载自blog.csdn.net/fengfengchen95/article/details/81556901