【Scala】Array数组

数组

定长数组

val arr = new Array[T](数组的长度)
val arr =Array(1,2,3,4,5)

//初始化一个长度为8的定长数组,其中所有元素均为0
val arr1 = new Array [Int](8)
//直接打印定长数组,内容为数组的hashcode值
println (arr1)

//toBuffer会将数组转换成变长数组缓冲
println(arr1.toBuffer)

//如果使用new,相当于调用了数组的apply方法,直接为数组赋值
val arr2=Array[Int](10)

//定义一个长度为3的定长数组,尝试将数据取出、修改,(min/sorted.reverse的用法)
val arr3 = Array("hadoop","bigdata","scala")




//定长数组并不限定数组元素的改变,但是不可以增删元素

变长数组

import scala.collection.mutable.ArrayBuffer

//定义一个变长数组
val arr4 =ArrayBuffer[Int]()
//向数组缓冲追加元素
//+=尾部追加元素
arr4 +=1
//追加多个元素
arr4 +=2,3,4//追加一个数组
arr4 ++=Array(6,7)
//追加一个数组缓冲
arr4 ++=ArrayBuffer(8,9)
//打印缓冲数组arr4
println(arr4)

//在数组的某一个位置插入元素用insert,从某下标插入
arr4.insert(0,-3,-2)
//删除数组某一个位置,用remove,按照下标删除
arr4.remove(1)
arr4 -=3
arr4 --=Array(6,7)
println (arr4)

数组遍历

//初始化一个数组
val arr3= Array[Int](1,2,3,4,5,6,7,8)
//for 循环
for (i <- arr3)
println(i)

//好用的until会生成一个Range
//reverse是将前面的生成的反转
for (i <- (0 until arr3.length).reverse)

//等价
//for (i <- (arr3.sorted.reverse))
//for (i <- (arr3.reverse))
println(i)

数组的转换

//yield实现数组的转换
scala> arr
res14: Array[Int] = Array(1, 2, 3, 4)

scala> val res1 = for (e <- arr) yield e*2
res1: Array[Int] = Array(2, 4, 6, 8)


提问字符串可以*2么??

//map实现数组的转换
scala> arr
res16: Array[Int] = Array(1, 2, 3, 4)

scala> val result =arr.map(_*2)
result: Array[Int] = Array(2, 4, 6, 8)

scala> result
res17: Array[Int] = Array(2, 4, 6, 8)


//定义一个数组,将偶数取出,乘以10
val arr3= Array[Int](1,2,3,4,5,6,7,8)

val result1 = for (i <- arr3 if i % 2 ==0)yield i*10
println(result1.toBuffer)

//更高级的方法
//filter是过滤,接收一个返回值为boolean的函数
//map相当于将数组中的每一个元素取出来,应用传进去的函数
val result2 = arr3.filter(_ % 2 ==0).map(_*10)
println(result2.toBuffer)

数组的常用算法

scala> arr
res18: Array[Int] = Array(1, 2, 3, 4)

scala> arr.min
res19: Int = 1

scala> arr.max
res20: Int = 4

scala> arr.sum
res21: Int = 10

scala> arr.sorted.reverse
res22: Array[Int] = Array(4, 3, 2, 1)
<think>嗯,用户问的是Scala数组和集合的关系,特别是数组是否属于集合类型。首先,我得回忆一下Scala的集合体系。Scala的集合主要分为三大类:Seq、Set和Map,这些都是不可变的,而可变集合则在scala.collection.mutable包下。不过数组Array)在Scala中比较特殊,因为它实际上是Java数组的包装,所以它的类型是Array[T],并不是直接继承自Scala的集合类型,比如Iterable或者Seq。 不过,虽然数组本身不属于Scala的标准集合类型,Scala为了兼容和操作方便,提供了隐式转换,可以把数组转换成ArraySeq或者WrappedArray,这样数组就可以当作集合来使用了。例如,当你在数组上调用map或者filter方法时,Scala会自动进行隐式转换,让数组支持这些集合操作。 用户可能在使用数组时发现它们的行为和其他集合类似,所以才会产生疑问。这时候需要明确数组Scala中的定位,它更接近Java的数组,但通过隐式转换获得了集合的操作能力。因此,严格来说,数组不属于Scala的集合类型,但可以当作集合来使用。 另外,用户可能在实际编码中遇到需要将数组与其他集合类型互相转换的情况,比如使用toSeq、toList等方法。这时候解释清楚隐式转换的作用和背后的机制会帮助用户更好地理解。 还要注意版本差异,比如Scala 2.13引入了ArraySeq作为默认的隐式转换,替代了之前的WrappedArray,这可能影响用户在不同版本中的体验。所以需要提到版本变化带来的影响,避免用户混淆。 总结来说,回答需要分两点:首先明确数组不属于Scala集合类型,然后解释隐式转换如何让数组拥有集合的操作能力。同时,提供相关的转换方法和示例代码,帮助用户实际操作。</think>在Scala中,数组(`Array`)与集合类型的关系需要从语言设计层面理解: 1. **数组的特殊性** Scala的`Array`底层直接映射为JVM的数组,其类型为`Array[T]`,不属于Scala标准集合层级(如`Iterable`或`Seq`)。例如: ```scala val arr = Array(1,2,3) arr.isInstanceOf[scala.collection.Iterable[_]] // 返回false ``` 2. **隐式转换的桥梁作用** 通过`scala.collection.ArrayOps`和`scala.collection.mutable.ArraySeq`的隐式转换,数组可以临时获得集合操作方法: ```scala Array(1,2,3).map(_ * 2) // 实际调用ArrayOps.map ``` 这种设计实现了**零成本抽象**:在需要集合操作时自动转换,但存储结构仍保持为原始数组[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值