scala集合之Array与List

2023-04-10 11:15:59

Scala中的集合包括Seq序列、Set组、Map映射,Seq包含了有索引的数组(Array、ArrayBuffer)和无索引的列表(List、ListBuffer)。
不可变集合指的是集合对象的存放地址、集合大小与类型、占用内存空间不可修改,只可以修改元素。若增删元素,则每次增删后会产生新对象,原有对象不会改变
可变集合指的是集合对象的存放地址、集合大小与类型、占用内存空间都可以修改,每次修改后不会产生新对象。对可变集合的操作尽量不要重新赋予新变量,因为新变量改变后,原变量也会随之改变。
可变集合包:scala.collection.mutable
不可变集合包:scala.collection.mutable

一、数组

数组就是常见的下标与元素一一对应的集合,即有索引的Seq。数组也分为可变与不可变,都用new关键字创建
new Array/ArrayBuffer[type](length)不可变数组是Array,可变数组是ArrayBuffer,可变数组的长度可以不定义

1、不可变数组

创建长度为5的整数型数组,并访问、修改元素

object Main {
  def main(args:Array[String])=
  {
	//空数组
	val arr1 = new Array[Int](5)
	//值数组
	val arr2 = Array(1,2,4,3,6)
	//访问数组第一个元素
	println(arr2(0))
	//修改并访问数组第2个元素
	arr2(1) = 8
	println(arr2(1))
  }		
}

遍历数组所有元素

object Main {
  def main(args:Array[String])=
  {	//直接遍历
	for (i <- arr2) println(i)
	
	//调用foreach方法
	arr2.foreach(println)

	//角标遍历
	for (j <- 0 until arr2.length) println(arr2(j))

	for (m <- arr2.indices) println(arr2(m)) //indices相当于数组所有角标组成的序列

	//迭代器,存在下一个则输出
	val iter = arr2.iterator
	  while (iter.hasNext)
		println(iter.next())
	  
	//输出所有元素组成的字符串
	println(arr2.mkString(" "))
  }		
}

增加元素产生新对象
调用方法:最后边新增:+、最前边新增+:

object Main {
  def main(args:Array[String])=
  {
    val arr2 = Array(1,2,4,3,6)
	//在最前面加元素
	val newarr = arr2.+:(8)
	val newarr1 = arr2.+:(8).+:(9)
	val newarr6 = 1 +: arr2 //方法调用的圆点可以省略,等同于数组、方法、新增元素用空格隔开。方法以:结尾时,右边往前调用的,也就是数组要在方法右侧,新增元素在方法左侧
	println(newarr.mkString("-"))
	println(newarr1.mkString("-"))
	println(newarr6.mkString("-"))
	
	//在最后边加元素
	val newarr2 = arr2.:+(7)
	val newarr3 = arr2.:+(0).:+(6)
	val newarr7 = arr2 :+ 2 //方法调用的圆点可以省略,等同于数组、方法、新增元素用空格隔开
	println(newarr2.mkString("-"))
	println(newarr3.mkString("-"))
	println(newarr7.mkString("-"))
	
	//同时在前后加元素
	val newarr4 = arr2.:+(1).:+(2).+:(3).+:(4)
	val newarr5 = 1 +: 2 +: arr2 :+ 3 :+ 4
	println(newarr4.mkString("-"))
	println(newarr5.mkString("-"))
  }		
}

2、可变数组

创建数组,访问、修改元素同不可变数组

object Main extends App {
    import scala.collection.mutable._
    //创建空数组
    val arr:ArrayBuffer[Int] = new ArrayBuffer[Int]()
    //创建值数组
	val newarr = ArrayBuffer(1,2,3)
	println(arr)
	println(newarr) //可变数组可直接输出,默认调用toString方法
}
ArrayBuffer()
ArrayBuffer(1, 2, 3)

增加元素
调用方法:最后边新增+=或append、最前边新增+=:或prepend、按索引插入元素insert、按索引插入数组insertAll或prependAll或appendAll

object Main extends App {
    import scala.collection.mutable._
	val newarr = ArrayBuffer(1,2,3)
	val newarr1 = Array(4,5)
	//最后边新增元素
	newarr += 4 += 5
	newarr.append(6,7)
	
	//最前边新增元素
	0 +=: newarr 
	newarr.prepend(8,9)
	
	//按索引新增元素
	newarr.insert(1,2,3) //新增元素
	
	//新增数组
	newarr.appendAll(newarr1) //最前边
	newarr.prependAll(newarr1) //最后边
	newarr.insertAll(2,newarr1) //按索引
	
	println(newarr)
}
ArrayBuffer(4, 5, 4, 5, 8, 2, 3, 9, 0, 1, 2, 3, 4, 5, 6, 7, 4, 5)

删除元素
调用方法:删除元素-=、按索引删除remove

object Main extends App {
    import scala.collection.mutable._
	val newarr = ArrayBuffer(1,2,3,4,5)
	//删除元素
	newarr -= 3
	println(newarr)
	//按索引删除
	newarr.remove(1) //删除索引1对应的元素
	println(newarr)
	newarr.remove(0,2) //从索引0开始,删除2个元素
	println(newarr)
}
ArrayBuffer(1, 2, 4, 5)
ArrayBuffer(1, 4, 5)
ArrayBuffer(5)

3、可变数组与不可变数组的相互转换:toArray、toBuffer

object Main extends App {
    import scala.collection.mutable._
    //可变转不可变
	val newarr = ArrayBuffer(1,2,3,4,5)
	val arr = newarr.toArray
	println(newarr)
	println(arr.mkString(","))
	
	//不可变转可变
	val newarr1 = (arr :+ 8).toBuffer
	println(newarr1)
}

4、多维数组

多维数组用Array.ofDim[type](i,j,…),i表示几行,j表示几列
创建2维数组,并访问

object Main extends App {
    //创建2行3列的数组
    val arr = Array.ofDim[Int](2,3)
    println(arr.mkString(","))
    //元素修改
    arr(0)(1) = 2
    arr(1)(2) = 3
    
    //按角标遍历
    for (i <- 0 until arr.length;j <- 0 until arr(i).length) println(arr(i)(j)) //输出每个元素
    
    for (i <- arr.indices;j <- arr(i).indices) {
        print(arr(i)(j) + "\t") //每行元素用空格分隔
        if (j == arr(i).length-1) println() //每行到最后一个元素时,输出空行
    }
    
    //调用foreach方法
    arr.foreach(line => line.foreach(println)) //数组的每行都调用方法
    arr.foreach(_.foreach(println)) //方法简写
}

5、队列Queue

队列为有序数组,先进 Queue.enqueue() 先出 Queue.dequeue,分为可变与不可变,分别用scala.collection.mutable/immutable来创建
队列是一个类,创建空队列需要使用关键字new(一般只有可变队列会先创建空队列,再往里边新增元素;不可变队列直接创建即可)
最常使用的是可变队列

  • 可变队列,队列可直接新增元素
object Main extends App {
    val list = List("f,g")
    val queue = new scala.collection.mutable.Queue[Any]
    queue.enqueue("a","b",3)
    println("队列:" + queue)
    println("第一个元素:" + queue.head) //第一个元素
    println("最后一个元素:" + queue.last) //最后一个元素
    println("尾队列:" + queue.tail) //除第一个元素外剩下的队列
    println("首队列:" + queue.init) //除最后一个元素外剩下的队列
    println("前2个元素:" + queue.take(2))
    println("后2个元素:" + queue.takeRight(2))
    println("出1:" + queue.dequeue)
    println("队列:" + queue)
    println("出2:" + queue.dequeue)
    println("队列:" + queue)
    
    //新增元素
    queue.enqueue("d","e") 
    queue += "f" 
    println("新进:" + queue)
    println("出3:" + queue.dequeue)
    println("队列:" + queue)
    //新增list内所有元素
    println("新增list内所有元素")
    println(queue ++= list)
    //新增list为一个元素
    println("新增list为一个元素")
    println(queue += list)
}
队列:Queue(a, b, 3)
第一个元素:a
最后一个元素:3
尾队列:Queue(b, 3)
首队列:Queue(a, b)2个元素:Queue(a, b)2个元素:Queue(b, 3)1:a
队列:Queue(b, 3)2:b
队列:Queue(3)
新进:Queue(3, d, e, f)33
队列:Queue(d, e, f)
新增list内所有元素
Queue(d, e, f, f,g)
新增list为一个元素
Queue(d, e, f, f,g, List(f,g))
  • 不可变队列
object Main extends App {
    val queue1 = scala.collection.immutable.Queue(1,2,3)
    println("队列:" + queue1)
    println(queue1.dequeue)
    println("队列:" + queue1)
    val queue2 = queue1.enqueue(4,5)
    println("出2:" + queue2.dequeue)
    println("队列:" + queue2)
}
队列:Queue(1, 2, 3)
(1,Queue(2, 3))
队列:Queue(1, 2, 3)2(1,Queue(2, 3, (4,5)))
队列:Queue(1, 2, 3, (4,5))

二、列表

列表List是一个没有索引的Seq序列,也分为可变和不可变。不可变列表本质是一个抽象类,创建的时候不需要使用new关键字,但可变列表创建时需要使用new关键字。直接创建含值列表时,可用List/ListBuffer()创建。

1、不可变列表

object Main extends App {
    //用List创建列表
    val list = List(1,2,3,4)
    println(list) //列表是封闭的,所以可以按列表形式直接打印
	
	//用Nil调用方法::,创建列表。Nil是一个空列表
    val list5 = 12 :: 13 :: 14 :: Nil
    println(list5)
    
    //访问元素的方式跟数组相同,这只是scala底层针对列表访问做了优化,并不代表列表有索引。列表就不能按索引赋值
    println("元素2:" + list(1))
    //调用foreach方法
    list.foreach(println)
}
List(1, 2, 3, 4)
List(12, 13, 14)
元素22
1
2
3
4

元素新增

object Main extends App {
    val list = List(1,2,3,4)
    println("list:" + list)
    //添加元素
    val list1 = list :+ 5 :+ 6
    println("list1:" + list1)
    val list2 = 7 +: 8 +: list
    println("list2:" + list2)
    
    //调用::方法,给列表最前边加元素
    val list3 = list.::(0).::(1)
    val list4 = 2 :: 3 :: list
    println("list3:" + list3)
    println("list4:" + list4) 
    
    //列表合并,调用方法:::或++
    val list5 = list1 ::: list
	val list6 = list1 ++ list
    println("list5:" + list5)
	println("list6:" + list6)
}
list:List(1, 2, 3, 4)
list1:List(1, 2, 3, 4, 5, 6)
list2:List(7, 8, 1, 2, 3, 4)
list3:List(1, 0, 1, 2, 3, 4)
list4:List(2, 3, 1, 2, 3, 4)
list5:List(1, 2, 3, 4, 5, 6, 1, 2, 3, 4)
list6:List(1, 2, 3, 4, 5, 6, 1, 2, 3, 4)

2、可变列表

object Main extends App {
    import scala.collection.mutable._
    val list = new ListBuffer[Int]()
    val list1 = ListBuffer(1,2,3)
    val list2 = ListBuffer(14,15)
    println("list:" + list)
    println("list1:" + list1)
    
    //添加元素
    list1.append(4,5)
    println("list1:" + list1)
    list1.prepend(6,7)
    println("list1:" + list1)
    10 +=: 11 +=: list1 += 8 += 9
    println("list1:" + list1)
    list1.insert(1,12,13)
    println("list1:" + list1)
    
    //插入列表
    list1.insertAll(1,list2)
    println("list1:" + list1)
    list1.appendAll(list2)
    println("list1:" + list1)
    list1.prependAll(list2)
    println("list1:" + list1)
    
    //列表合并
    list1 ++= list2 //只改变list1,list2不变
    println("list1:" + list1)
    println("list2:" + list2)
    
    //修改元素
    list1(2) = 1
    println("元素2:" + list1(2))
    
    //删除元素
    list1.remove(1) //删除第2个元素
    println("删除第2个元素" + list1)
    list1 -= 3 //删除元素3
    println("删除元素3" + list1)
}
list:ListBuffer()
list1:ListBuffer(1, 2, 3)
list1:ListBuffer(1, 2, 3, 4, 5)
list1:ListBuffer(6, 7, 1, 2, 3, 4, 5)
list1:ListBuffer(10, 11, 6, 7, 1, 2, 3, 4, 5, 8, 9)
list1:ListBuffer(10, 12, 13, 11, 6, 7, 1, 2, 3, 4
  • 作者:Ayanha
  • 原文链接:https://blog.csdn.net/weixin_45052608/article/details/116600790
    更新时间:2023-04-10 11:15:59