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

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

posted @ 2018-09-13 07:28  stone1234567890  阅读(207)  评论(0编辑  收藏  举报