0
点赞
收藏
分享

微信扫一扫

Scala中集合和数组

阿尚青子自由写作人 2022-02-24 阅读 71


主要集合特质

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 = ArrayBuffer​​int​​

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.ofDim​​double​​​

//多维数组 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



举报

相关推荐

0 条评论