【Scala】基本数据结构(数组、列表、元组、集、映射、迭代器)

1 数组(Array)

1.1 创建数组

1、new一个数组,指定长度和数据类型

val array = new Array[Int](3)

2、使用数组Array的伴生对象创建

val array = Array[String]("hello","world")

1.2 获取索引的值

array(1)

1.3 修改指定索引的值

array(1) = "abc"

1.4 判断元素是否存在

array.contains("hello")

1.5 长度

array.size
array.length

1.6 遍历

for(a <- array){
}

2 可变数组(ArrayBuffer)

2.1 创建

1、创建一个Int类型的可变数组,可变数组维护的定长数组初始化长度为3,超过进行扩容

val ab = new ArrayBuffer[Int](3)

2、创建一个String类型可变数组(不可赋值)

val ab = new ArrayBuffer[String]()

3、使用ArrayBuffer来创建对象

val ab = ArrayBuffer[String](12)

2.2 增加元素

1、普通增加

ab.append(5)
ab.append(1,2,3,4)

2、指定位置插入增加

例:在1位置插入两个元素 -1、-2

ab.insert(1,-1,-2)

2.3 获取指定索引的元素

ab.get(1)

2.4 修改指定索引的元素

ab(4)=-4

2.5 删除指定

1、remove

一个参数

//删除索引为2的元素并获取
ab.remove(2)

两个参数

//从索引为1开始删除3个元素
//例如:1、2、3、4、5 删除后为 1、5
ab.remove(1,3)

2、drop

//删除前2个元素
ab.drop(2)

2.6 判断

ab.contain()

2.7 长度

ab.size
ab.length

2.8 定长数组和可变数组之间的转换

val array = Array(-1,-2,-3,-4,-5,-6)
//数组转可变数组
val ab = array.toBuffer

//可变数组转数组
array = ab.toArray
//将集合中每一个元素按照指定分隔符拼接为字符串,同时添加起始和结束字符
array.mkString(",")

array.mkString("[",",","]")

2.9 遍历

for (i <- ab){
}

for-each函数

array.foreach(num => println(num))

2.10 求和、最值、排序

1、求和

ab.sum

2、最值

ab.max

ab.min

3、排序

//从小到大
ab.sorted

//从大到小
ab.sortWith((v1,v2) => v1 > v2)

3 映射(map)

Map是一个对偶,映射的k-v键值对的集合,k不重复

Scala中有可变Map不可变Map

3.1 不可变Map

构造出一个不可变Map[String,Int],其值不可变

val p = Map[String,Int](
	"Alice" -> 20,
	"job" -> 20
	)

3.1.1 获取值

1、p.get(key)如果有则输出,没有则返回none

val key = "job"

val age = p.get(key).get

2、直接获取

val age = p(key)

3.1.2 修改 增加

p("job")=20
//删除返回一个新集合,原集合不变
p.drop(1)

3.2 可变Map

val p = scala.collection.mutable.Map[String,Int](
	"Alice" -> 20,
	"job" -> 20
	)

3.2.1 添加元素

//添加
map("a")=14
//修改
map("job")=22
//添加
map.put("b",20)
//删除前两个元素,原集合不变
map.drop(2)

3.2.2 遍历

for((k,v) <- map){
}
for(kv <- map){
	println(kv.1)
	println(kv.2)
}
map.foreach(kv=>{
	println(kv.1)
	println(kv.2)
})

4 元组(Tuple)

映射是键/值对偶的集合,对偶是元组的最简单形态,元组是不同类型的值的聚集。元组的值是通过将单个的值包含在圆括号里构成的。例如:(1,3.14,“abc”)是一个元组

注意:元组的各组元从1开始

4.1 构建

1、第一种

val tuple = new Tuple2[String,Int]("zhang",13)

2、第二种

val tuple2 = ("zhang",13)

3、第三种

val (a,b,c,d) = ("a1","b1","c1","d1")
println((a,b,c)) //输出a1、b1、c1

4.2 获取值

val tuple = ("zhang",13)
val name = tuple._1
val age = tuple._2

4.3 遍历

for(t <- tuple.productIterator){
  println(t)
}

5 zip拉链操作

zip操作就是将两个单列的集合组合成双列的集合,集合中每一组元素就是上述学习过的tuple

1、a.zip(b)

val p = Array("山东","河南")
val c = Array("济南","郑州")

val pcs = p.zip(c)

for(pc <- pcs){
  val p = pc._1
  val c = pc._2
  println(p)
  println(c)
}

2、a.zipAll(b,"a","b")

对没有匹配上的值自动进行填充,第一个(a)和第二个集合中多余的元素进行配对

val p = Array("山东","河南")
val c = Array("济南","郑州")

val pcs = p.zipAll(c,"a","b")
for(pc <- pcs){
  val p = pc._1
  val c = pc._2
  println(p)
  println(c)
}

6 列表(List)

6.1 创建

val intList = List(1,2,3)

6.2 获取

头部:

//返回一个值--------1
intList.head

尾部:

//返回一个列表-----List(2, 3)
intList.tail

索引:

list()

6.3 增加元素

1、增加一个元素

  • list.+:(A):将元素A添加到list首部
  • list.::(A):将元素A添加到list首部
  • list.:+(A):将元素A添加到list尾部

2、增加一个集合

  • list.:::(A):将集合A添加到list首部
  • list.++:(A):将集合A添加到list首部
  • list.++(A):将集合A添加到list尾部

6.5 删除

//从尾部开始删除1个元素
list.dropRight(1)

6.6 union

//组合,相当于sql里面的union all
left.union(right)

6.7 intersect

//交集
left.intersect(right)

6.8 diff

//差集
left.diff(right)

6.9 take

//获取集合中的前n个元素,如果该集合有序就是top n
left.take(2)

7 集合(set)

set是没有先后次序的值,元素值不可重复

7.1 有序的集合

val sorted = SortedSet("abc","abcd","a","abcdf")

输出:“a” “abc” “abcd” “abcdf”

7.2 基于自定义数据构建有序的集合

需要让元素具备可比性,或者为容器提供比较器

1、让元素具备可比性(实现特质Ordered

case class Person(name:String,age:Int,height:Double) extends Ordered[Person]{
	//定义比较规则:先按照年龄升序排序,后年龄,后身高
	override def compare(that:Person){
		var ret = this.age.compareTo(that.age)
		if(ret == 0){
			ret = that.height.compareTo(this.height)
		}
		ret
	}
}

2、为容器提供比较器(实现特质Ordering

val person = SortedSet()(new Ordering[Person](){
	override def compare(that:Person){
			var ret = this.age.compareTo(that.age)
			if(ret == 0){
				ret = that.height.compareTo(this.height)
			}
			ret
		}
})

8 迭代器(Iterator)

迭代器包含两个基本操作:nexthasNext。next可以返回迭代器的下一个元素,hasNext用于检测是否还有下一个元素。

1、while循环

val iter = Iterator("Hadoop","Spark","Scala")
while (iter.hasNext) {
    println(iter.next())
}

2、for循环

val iter = Iterator("Hadoop","Spark","Scala")
for (elem <- iter) {
    println(elem)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的冲浪码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值