主要集合特质
Scala支持可变集合和不可变集合,不可变集合从不可变,可以安全并发访问
主要包:
不可变集合: scala.collection.immitable
可变集合:scala.collection.mutable
scala优先采用不可变集合:
序列(list),集(set),映射(Map),所有的集合都扩展Iterable特质,对于所有集合类,Scala 都同时提供了可变和不可变的版本
数组
定长数组
Array 以 java 数组的方式实现,val nums = new Array[Int] 10
val nums = new Array[Int](10)
val s = Array("Hello", "World")
s(0) = "Goodbye"
s
变长数组
可以使用ArrayBuffer,(Java中用ArrayList)
import scala.collection.mutable.ArrayBuffer
val b = ArrayBufferint
Array与ArrayBuffer互转
ArrayBuffer = Array.toBuffer
Array = ArrayBuffer.toArray
import scala.collection.mutable.ArrayBuffer
val b = ArrayBuffer[Int]()
val b2 = new ArrayBuffer[Int] // If you use new, the () is optional
b += 1
b += (1, 2, 3, 5)
b ++= Array(8, 13, 21)
//删除最后2个元素
b.trimEnd(2)
b
//从第三个元素上插入7,8,0
b.insert(2,7,8,0)
b
//删除第三个元素
b.remove(2)
b
//删除从第三个元素开始的三个元素
b.remove(2,3)
b
//变长数组和不变长数组之间的交换
val a1 = b.toArray
a1
a1.toBuffer
a1
数组遍历
//数组的遍历
for(i<- 0 until a1.length)
println(i + ":" + a1(i))
for (i <- a1)
println(i)
//数组索引
for (i <- a1.indices)
println(i+":"+a1(i))
//产生一个range
0 until a1.length
//产生一个range,2为间隔
0 until(a1.length,2)
//range反转
(0 until a1.length).reverse
数组转换
转换动作不会修改原数组,而是产生一个新的数组
import scala.collection.mutable.ArrayBuffer
val a = Array(2,4,5,67,8,9)
//产生新的数组
val result = for (elem <- a) yield 2 *elem
//这里的elem不是下标是元素的值
for (elem <- a if elem %2 == 0) yield 3 *elem
//res1: Array[Int] = Array(4, 8, 16)
a.filter(_%2 == 0).map(2 * _)
//求和
a.sum
//最大值
a.max
//排序
a.sorted
scala.util.Sorting.quickSort(a)
a
//转成string 间隔符and
a.mkString( " and ")
//<2,4,5,8,9,67>
a.mkString("<",",",">")
a.toString
a
//统计大于10的数字的个数
a.count(_>5)
//添加元素
val b2 = new ArrayBuffer[Int]()
b2 ++= Array(8, 13, 21)
b2.append(21,35,66)
b2
b2.appendAll(a)
b2
//增加元素 4 减少 21
b2 += 4 -=21 -=21
// 加到20项,用666填充
b2.padTo(20,666)
多维数组
通过数组的数组实现,用ofDim方法
val matrix = Array.ofDimdouble
//多维数组 3行4列
val matrix = Array.ofDim[Double](3,4)
val row = 0
val colum = 2
matrix(0)(2) = 235
matrix.length
matrix(row)
matrix(row).length
//打印杨辉三角
val triangle = new Array[Array[Int]](10)
for (i <- triangle.indices)
triangle(i) = new Array[Int](i + 1)
triangle(0)(0) = 1
for (i <- 1 until triangle.length) {
triangle(i)(0) = 1
triangle(i)(i) = 1
for (j <- 1 until triangle(i).length - 1)
triangle(i)(j) = triangle(i - 1)(j - 1) + triangle(i - 1)(j)
}
for (row <- triangle) {
for (elem <- row) print(elem + " ")
println()
}
和java数组的相互操作
Scala 数组是通过 Java 进行实现的,所以可以进行互相转换操作
使用scala.collection.convert. AsJavaConverters 或者 AsScalaConverters 进行转换
import scala.collection.JavaConverters._
import scala.collection.mutable
import scala.collection.mutable.ArrayBuffer
val command = ArrayBuffer("ls", "-al", "/")
// ProessBuilder是java方法
val pb = new ProcessBuilder(command.asJava) // Scala to Java
val cmd : mutable.Buffer[String] = pb.command().asScala // Java to Scala
cmd == command