本文详细介绍了Scala中的数组和ArrayBuffer的使用,包括数组的固定长度和动态扩展,ArrayBuffer的添加、修改、遍历以及常见操作如求和、查找最大值、排序等。还探讨了如何高效地处理数组转换和条件过滤问题。
摘要由CSDN通过智能技术生成
-
固定长度使用
Array
, 长度有可能变化使用
ArrayBuffer
-
提供初始值不要使用
new
-
用
()
来访问数组
def main(args: Array[String]): Unit = {
val nums = new Array[Int](10)
nums(1) = 1
val nums2 = Array(1,2,3)
nums2(1) = 6;
println("修改后" + nums2(1))
val ab = new ArrayBuffer[Int]
ab += 1
ab += (2,3,5,6,7)
ab ++= Array(8,9,10)
ab.trimStart(1);ab.trimEnd(3)
ab.insert(2,4)
ab.remove(2)
ab.remove(2,3)
- 用
for(elem <- arr)
来遍历元素 - 用
for(elem <- arr if ...) ... yield
来将原数组转为新数组
def main(args: Array[String]): Unit = {
val nums3 = Array(1,2,3,4,5,6,7,8)
for(num <- 0 to nums3.length - 1) print(nums3(num))
for(num <- 0 until nums3.length ) print(nums3(num))
for(num <- 0 until(nums3.length,2) ) print(nums3(num))
for(num <- ( 0 until nums3.length ).reverse) print(nums3(num))
val nums4 = for(elem <- nums3) yield 2 * elem
val nums5 = for(elem <- nums3 if elem % 2 == 0) yield 2 * elem
val num6 = nums3.filter(_ %2 ==0 ).map(2 * _)
这些转换操作不会修改原数组,而是产生一个全新的数组。
从数组出发得到另一个数组, 从数组缓冲出发得到新的数组缓冲
一个示例:
给定一个整数的数组缓冲,我们想要移除除第一个负数之外的所有负数。传统的方法会在遇到第一个负数时置一个标记,然后移除后续出现的负数元素
def main(args: Array[String]): Unit = {
val ab = ArrayBuffer(-3, -2, -1, 0, 1, 2, 3, 4)
var first = true
var n = ab.length
var i = 0
while (i < n) {
if (ab(i) >= 0) {
i += 1
} else {
if (first) {
first = false
i += 1
} else {
ab.remove(i)
n -= 1
但实际上,写过算法题《移除元素》 的同学都知道,把非负数值拷贝到前端要好很多
val ab1 = ArrayBuffer(-3, -2, -1, 0, 1, 2, 3, 4)
var first = true;
val indexes = for( i <- 0 until ab1.length if first || ab1(i) >= 0) yield{
if (ab1(i) < 0) first = false
for( j <- 0 until indexes.length) ab1(j) = ab1(indexes(j) )
ab1.trimEnd(ab1.length - indexes.length)
println(ab1)
val indexes = for( i <- 0 until ab1.length if first || ab1(i) >= 0) yield{
if (ab1(i) < 0) first = false
上面的另一种写法是:
for (i <- 0 until ab1.length) {
if (first || ab1(i) >= 0) {
indexes += i
if (ab1(i) < 0) {
first = false
val num = Array(1,2,3,4,5).sum
val bf1 = ArrayBuffer(1,2,5,7,0).max
val bf2 = ArrayBuffer(1,2,5,7,0).min
val a = ArrayBuffer(1, 2, 5, 7, 0).sorted
val b = ArrayBuffer(1, 2, 5, 7, 0).sorted.reverse
val c = Array(1,4,3,8,9)
Sorting.quickSort(c)
val str = Array("You", "I" ,"your friend steve")
println(str.mkString(" and "))
println(str.mkString("<", " and ", ">"))
val d = Array(-1,2,-9,3,5,6)
println(d.count( _ < 0))
val bbc = ArrayBuffer(1,2,3)
bbc.append(4,5)
println(bbc)
val buffer = ArrayBuffer[Int]()
buffer.appendAll(Seq(1, 2, 3))
println(buffer)
本篇主要学习如何在Scala中操作数组。Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素。在Scala中,我们的选择更多,不过现在我们先假定不关心其他选择,而只是想马上开始用数组。
本篇的要点包括:
1. 若长度固定则使用Array,若长度可能有变化则使用ArrayBuffer
2. 提供初始值时不要使用new
3. 用()来访问元素
4. ...
Scala 数组
Scala 语言中提供的数组是用来存储固定大小的同类型元素,数组对于每一门编辑应语言来说都是重要的数据结构之一。
声明数组变量并不是声明 number0、number1、…、number99 一个个单独的变量,而是声明一个就像 numbers 这样的变量,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来表示一个个单独的变量。数组中某个指定的元素是通过索引来访问的。
数组的第一个元素索引为0,最后一个元素的索引为元素总数减1。
声明数组
以下是 Scal
//创建不可变数组可以直接赋值
scala> var arr1=Array(10,20,30,40)
arr1: Array[Int] = Array(10, 20, 30, 40)
//创建不可变数组也可以只指定数组长度,暂时不赋值
scala> var arr=new Array[Int](10)
arr: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
//创建一个长度1
1、不可变数组的定义
①、val arr=new Array[Int](5) 定义一个长度为五的定长数组
②、val arr= Array[Int](1,4,5,6,7)给定泛型和内容的定长数组
③、val arr3=Array(1,3,true,"hello",3.5,2L) 不给泛型给内容的定长数组
2、可变数组的定义
前提:先导包
import scala.collection.mutable._
①、val arr=new ArrayBuffer[Int]() new 一个Arr
CSDN-Ada助手:
Spark从星火到燎原Ⅰ
CSDN-Ada助手:
Spark从星火到燎原Ⅱ
CSDN-Ada助手: