Scala 集合

本文深入探讨Scala中的数据结构,包括数组、列表、集合、映射和元组等基本概念及操作方法,展示了Scala如何优雅地处理各种数据结构,适用于初学者和进阶开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组

定长数组

scala> val a = new Array[String](5)
a: Array[String] = Array(null, null, null, null, null)

scala> a
res0: Array[String] = Array(null, null, null, null, null)

scala> a.length
res1: Int = 5

scala> a(1) = "hello"

scala> a
res3: Array[String] = Array(null, hello, null, null, null)

scala> a(1)
res4: String = hello

scala> val b = Array("hadoop", "spark", "storm")
b: Array[String] = Array(hadoop, spark, storm)

scala> b(1)
res5: String = spark

scala> b(2)="java"

scala> b
res7: Array[String] = Array(hadoop, spark, java)

scala> val c=Array(1,2,3,4,5,6,7,8)
c: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8)

scala> c.sum
res8: Int = 36

scala> c.max
res9: Int = 8

scala> c.min
res10: Int = 1

scala> c.mkString
res11: String = 12345678

scala> c.mkString(",")
res12: String = 1,2,3,4,5,6,7,8

scala> c.mkString("<",",",">")
res13: String = <1,2,3,4,5,6,7,8>

变长数组

scala> val d=scala.collection.mutable.ArrayBuffer[Int]()
d: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

scala> d.length
res14: Int = 0

scala> d+=1
res15: d.type = ArrayBuffer(1)

scala> d+=2
res16: d.type = ArrayBuffer(1, 2)

scala> d
res17: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2)

scala> d+=(3,4,5)
res18: d.type = ArrayBuffer(1, 2, 3, 4, 5)

scala> d ++= Array(6,7,8,9)
res21: d.type = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)

// 在第0个位置插入0
scala> d.insert(0,0)

scala> d
res23: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

// 去掉第二个索引位置的值
scala> d.remove(2)
res24: Int = 2

scala> d
res25: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(0, 1, 3, 4, 5, 6, 7, 8, 9)

// 从第五个索引位置开始,去掉2个值
scala> d.remove(5,2)

scala> d
res27: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(0, 1, 3, 4, 5, 8, 9)

// 去掉最后两个值
scala> d.trimEnd(2)

scala> d
res29: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(0, 1, 3, 4, 5)


// 可变数组转换成不可变数组
scala> d.toArray
res30: Array[Int] = Array(0, 1, 3, 4, 5)

scala> d.mkString
res31: String = 01345


// 遍历数组
scala> for(i <- 0 until d.length){
     |     print(d(i)+" ")
     |   }
0 1 3 4 5

scala> for (ele <- c){
     |     print(ele+" ")
     |   }
1 2 3 4 5 6 7 8

scala> for(i <- (0 until d.length).reverse){
     |     print(d(i)+" ")
     |   }
5 4 3 1 0

list

scala> Nil
res36: scala.collection.immutable.Nil.type = List()
// 定义一个List
scala> val l = List(1, 2, 3, 4, 5)
l: List[Int] = List(1, 2, 3, 4, 5)

scala> l.head
res37: Int = 1

scala> l.tail
res38: List[Int] = List(2, 3, 4, 5)

// 拼接其他List
scala> val l2 = 1 :: Nil
l2: List[Int] = List(1)

scala> val l3 = 2 :: l2
l3: List[Int] = List(2, 1)

scala> l.length
res39: Int = 5

// 定义一个变长List
scala> val l5 = scala.collection.mutable.ListBuffer[Int]()
l5: scala.collection.mutable.ListBuffer[Int] = ListBuffer()

scala> l5 += 2
res40: l5.type = ListBuffer(2)

scala> l5 += (3, 4, 5)
res41: l5.type = ListBuffer(2, 3, 4, 5)

scala>   l5 ++= List(3, 4, 5, 6)
res42: l5.type = ListBuffer(2, 3, 4, 5, 3, 4, 5, 6)

scala>   l5 -= 2
res43: l5.type = ListBuffer(3, 4, 5, 3, 4, 5, 6)

scala>   l5 -= (1, 4)
res44: l5.type = ListBuffer(3, 5, 3, 4, 5, 6)

scala>   l5 --= List(4, 5, 6)
res45: l5.type = ListBuffer(3, 3, 5)

scala>   l5.toList
res46: List[Int] = List(3, 3, 5)

scala>   l5.toArray
res47: Array[Int] = Array(3, 3, 5)

scala>   l5.isEmpty
res48: Boolean = false

scala>   l5.head
res49: Int = 3

scala>   l5.tail.head
res50: Int = 3

递归求和

Set :无序,不可重复

scala> val s = Set(1, 2, 3, 1, 2, 5, 6)
s: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3)

// 可变Set
scala> val set = scala.collection.mutable.Set[Int]()
set: scala.collection.mutable.Set[Int] = Set()

scala> set += 1
res53: set.type = Set(1)

scala> set += (1, 2, 3, 4)
res54: set.type = Set(1, 2, 3, 4)

Map

// 定义一个Map
scala> val students = Map("lisi" -> "class 1", "zhangsan" -> "class 2", "wanger" -> "class 3")
students: scala.collection.immutable.Map[String,String] = Map(lisi -> class 1, zhangsan -> class 2, wanger -> class 3)

// Map的key
scala>   students.keys
res55: Iterable[String] = Set(lisi, zhangsan, wanger)

// Map的value
scala>   students.values
res56: Iterable[String] = MapLike(class 1, class 2, class 3)

scala>   students.isEmpty
res57: Boolean = false

// 定义一个可变的Map
scala>   val students2 = scala.collection.mutable.Map[String, String]()
students2: scala.collection.mutable.Map[String,String] = Map()

scala>   students2 += ("zhaosi" -> "class 4")
res58: students2.type = Map(zhaosi -> class 4)

// 合并两个Map,结果是可变的Map
scala>   students ++ students2
res59: scala.collection.immutable.Map[String,String] = Map(lisi -> class 1, zhangsan -> class 2, wanger -> class 3, zhaosi -> class 4)

// 遍历Map
scala>   students.keys.foreach { i =>
     |     print("key = " + i)
     |     println("value = " + students(i))
     |   }
key = lisivalue = class 1
key = zhangsanvalue = class 2
key = wangervalue = class 3

scala>
     |   students.contains("lisi")
res62: Boolean = true

Tuple:不可变,可以包含不同类型的元素

// 定义tuple
scala> val t = (1, 3.14, "lisi")
t: (Int, Double, String) = (1,3.14,lisi)

scala> val t2 = Tuple3(1, 3.14, "zhangsan")
t2: (Int, Double, String) = (1,3.14,zhangsan)

// 遍历tuple
scala> t.productIterator.foreach { i => println("value = " + i) }
value = 1
value = 3.14
value = lisi

// 通过下标访问元素
scala> t._1
res66: Int = 1

scala> t._2
res67: Double = 3.14

// 转换成字符串
scala> t.toString()
res68: String = (1,3.14,lisi)

Option:用来表示一个值是可选的

Option[T] 是一个类型为 T 的可选值的容器: 如果值存在, Option[T] 就是一个 Some[T] ,如果不存在, Option[T] 就是对象None 。

scala> val students = Map("lisi" -> "class 1", "zhangsan" -> "class 2", "wanger" -> "class 3")
students: scala.collection.immutable.Map[String,String] = Map(lisi -> class 1, zhangsan -> class 2, wanger -> class 3)

scala> students.get("list")
res69: Option[String] = None

scala> students.get("lisi")
res70: Option[String] = Some(class 1)
scala> val o1=Some(5)
o1: Some[Int] = Some(5)

scala> val o2=None
o2: None.type = None

scala> o1.getOrElse(0)
res72: Int = 5

// 没有取到值就使用给定的值
scala>  o2.getOrElse(10)
res73: Int = 10

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值