三、Scala数组相关操作

博客主要介绍了Scala中数组的相关知识,包括定长数组、变长数组(数组缓冲),讲述了数组和数组缓冲的遍历、转换方法,还提及常用算法、多维数组创建。此外,说明了Scala与Java在数组类型转换上的差异,调用带Object[]数组的方法需手动转换。

1、定长数组

val nums = new Array[Int](10)//10个整数的数组,所有元素初始化为0
val s = Array("hello","world")//长度为2,类型由Scala自行推断,因为给了初始值,所以不用写new
s(0) = "google" //元素的访问使用()而不是[]

2、变长数组:数组缓冲

对于变长数组,Scala中的等效结构是ArrayBuffer

import scala.collection.mutable.ArrayBuffer
val b = ArrayBuffer[Int]()//或者不写()改用new ,此处表示一个空的数组缓冲,准备存放整数
b+=1	//使用+=在尾端添加元素
b+=(1,2,3,4,5,6)	//在尾端添加多个元素,以括号包起来
b++=Array(8,12,13)	//可以用++=操作符在后面追加任何集合

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

b.insert(2,6)	//在下标2之前插入
b.insert(2,1,2,3,1,3)	//在下标2前插入多个元素

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

b.toArray(1,1,2)	//此做法为当不确定自己要构建的Array要装多少个元素时,可以先使用ArrayBuffer,然后在转换为Array
//同理,也可以使用a.toBuffer将一个数组a转化为一个数组缓冲

注意:在任意位置插入或者移除元素并不高效

3、遍历数组和数组缓冲

用for魂环遍历数组或者数组缓冲for(i <- 区间)

for(i<- 0 until a.length)//until类似于to,但是不包含a.length
	println(s"$i:${a(i)}")//s开头,字符串可以包含表达式但不能有格式化指令,拓展:row开头不会求值转义字符
设置每一步的步长
0 until a.length by 2//得到的结果是Range(0,2,4,6,8)

若想重尾端开始遍历,则设置步长为-1

0 until a.length by -1

不使用数组下标,直接访问数组元素

for(elem <- a)
	println(elem)

4、数组转换

在Scala中,以某种方式对它进行转换是很简单的,这些转换操作不会修改原始数组,而是创建一个全新的数组。

val a = Array(2,3,5,7,11)
val result = for(elem<-a) yield 2 *elem

还可以在循环中添加守卫

for(elem <-a if elem % 2 ==0)	yield 2*elem

但是通常会使用另一种写法

a.filter(_ % 2==0).map(2 * _)//可以用{}代替()

前面所述均是创建了一个新的数组,如若要修改原来的数组(获取数组的下标序列可以使用indices

val positionToRemove = for(i<-a.indices if a(i) <0 )yields i
for(i <-positionToRemove.reverse) a.remove(i)
//另一种更好的方式是将要的元素复制到前面,然后截取指定个数的元素

5、常用算法

max,min,sum,sorted,sortedWith(),qucikSort()
mkString("<",",",">")//分别表示前缀,分隔符,后缀

6、解读Scaladoc

暂时不做过多解释

7、多维数组

创建一个Array[Array[Double]]类型的数组

val matrix = Array.ofDim[Double](3,4)//三行四列
//访问元素的方式:martix(row)(column) = 42

若要创建不规则的数组

val trangle = Array[Array[Int]](10)
for(i<-trangle.indices)
	trangle(i) = new Array[Int](i+1)

8、与Java的互操作

Java的String[]数组可以被传入一个预期Java的Object[]数组的方法,但是Scala并不允许这样的自动转换。
如果你想调用一个带Object[]数组的方法,需要手动进行类型转换

val a = Array("dadas","dasdad","assda","dadadas")
java.util.Arrays.binarySearch(a.asInstanceOf[Array[Object]],"breef")

此部分为表示清楚

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值