Scala数组,映射,元组

数组

  • 若长度固定则使用Array,若长度可能变化则使用ArrayBuffer。
  • 提供初始值时不要使用new。
  • 用()来访问元素。
  • 用for(elem <- arr)来遍历元素。
  • 用for(elem <- arr if expression) yield expression来将元数组转型为新数组。
  • scala数组可以和java数组互操作,用ArrayBuffer,使用scala.collection.JavaConversions中的转换函数。

定长数组

val nums = new Array[Int](10)
val s = Array("hello","world")//提供初始值不需要new,并且类型可以推断出来。
s(0) = "goodbye"

在jvm中,scala的Array以java数组方式实现。

变长数组:数组缓冲

import scala.collection.mutable.ArrayBuffer
val b = ArrayBuffer[Int]()
b += (1,2,3,4)
b ++= Array(1,2,3)
b.trimEnd(5)//移除最后5个元素。
b.insert(2,3,4,5)//在下标2之前插入3,4,5。
b.remove(2,3)//移除从下标2开始的3个元素。

有时候,你需要构建一个Array,但不知道最终需要装多少个元素,在这种情况下,先构成一个数组缓冲,然后调用:

b.toArray
//反过来,你也可以将Array转换成数组缓冲
a.toBuffer

数组转换

val a = Array(2,3,4,5)
val result = for(elem <- a if elem % 2 == 0) yield 2 *elem
//守卫+yield的方式也可以用filter+map的方式实现
a.filter(_ % 2 == 0).map( 2 * _)

常用算法

val a = Array(1,7,2,9)
val b = a.max/sum
val c = a.sorted

可以提供一个比较函数,不过你需要用sortWith函数:

val d = b.sortWith(_ > _)

如果你想显示数组/数组缓冲的内容,可以用mkString方法,它允许你指定元素之间的分隔符。

a.mkString("-")//用-分隔数组元素,组成一个字符串。

多维数组

可以用ofDim方法来构造多维数组:

val matrix = Array.ofDim[Double](3,4)
matrix(1)(2) = 3.0

你可以创建不规则的数组,每一行长度各不相同:

val matrix2 = new Array[Array[Int]](10)
for(i <- 0 until matrix2.length)
    matrix2(i) = new Array[Int](i+1)

与java的互操作

scala的数组使用java数组实现的,你可以在java和scala之间来回传递。 你需要引入scala.collection.JavaConversions里的隐式转换。这样你就可以将scala的数组缓冲传递到接收java数组的函数中去了。

import scala.collection.JavaConversions.bufferAsJavaList
import scala.collection.mutable.ArrayBuffer
val command = ArrayBuffer("ls","-al","/home/cay")
val pb = new ProcessBuilder(command)
//将scala 转换成java

映射和元组

  • 你需要从可变和不可变的映射中做出选择。
  • 默认情况下,你得到的是一个哈希映射,不过你也可以指明要树形映射。
  • 可以方便的从scala映射和java映射之间来回切换。

构造映射

val scores = Map("Alice" -> 10,"Bob" -> 3,"Candy" -> 8)
val scores2 = new scala.collection.mutable.Map("Alice" -> 10,"Bob" -> 3,"Candy" -> 8)
val scores3 = Map(("Alice",10),("Bob",3),("Candy",8))

获取映射的值

val Bobscore = scores("Bob")
val Alicescore = scores.getOrElse("Bob",0)

get(key)函数返回一个Option对象,要么是Some(键对应的值),要么是None。

更新映射中的值

在可变map中,可以添加新的关系,也可以删除关系。

scores2("Bob") = 10
scores2 += ("Fred" -> 11)
scores2 -= "Alice"

你不能更新一个不可变map,但是也可以做一些有用的操作,例如,利用一个不可变map生成一个新的map。

val newscores = scores + ("Bob" -> 14,"Fred" -> 9)

迭代映射

for((k,v) <- scores)
for(v <- scores.values)
for(k <- scores.keySet)

已排序映射

如果你需要顺序的访问所有的键,你需要声明一个树形映射,而默认是一个哈希表。

val scores3 = scala.collections.immutable.SortedMap("Alice" -> 10,"Bob" -> 3,"Candy" -> 8)

元组

元组是不同类型的值的集合。

val t = (1,3.14,"Fred")
val second = t._2//访问第二个元素,元素是从1开始的,这点跟数组不同。
val (first,second,third) = t
val (first,second,_) = t

zip函数

val symbols = Arary("<","-",">")
val counts = Array(2,10,2)
val pairs = symbols .zip(counts)
//Array(("<",2),("-",10),(">",2))

还有一种常用的用例,是用toMap函数把对偶的集合转换成映射。

keys.zip(values).toMap

Comments !