Scala序列List

Scala 的集合有三大类:序列 Seq、集 Set、映射 Map,所有的集合都扩展自 Iterable。
在 Scala 中集合有可变(mutable)和不可变(immutable)两种类型, immutable 类型的集合初始化后就不能改变了(注意与 val 修饰的变量进行区别)。

目录


不可变序列

导包

import scala.collection.immutable._

在 Scala 中列表要么为空(Nil 表示空列表)要么是一个 head 元素加上一个 tail 列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表。
注意: :: 操作符是右结合的,如 9 :: 5 :: 2 :: Nil 相当于 9 :: (5 :: (2 :: Nil))。

1. 构建List序列

// 构建不可变的序列
val lst = List(1,2,3)        // List(1, 2, 3)

2. 插入

//将 0 插入到 lst 的前面生成一个新的 List,几种方式
val lst2 = 0 :: lst
val lst3 = lst.::(0)
val lst4 = 0 +: lst
val lst5 = lst.+:(0)        // List(0, 1, 2, 3)

3. 追加

//将一个元素添加到 lst1 的后面产生一个新的集合
val lst6 = lst :+ 3        // List(1, 2, 3, 3)

4. 合并

val lst0 = List(1,2,3)
val lst1 = List(4,5,6)

//将 2 个 list 合并成一个新的 List
val lst2 = lst0 ++ lst1

//将 lst0 插入到 lst1 前面生成一个新的集合
val lst3 = lst0 ++: lst1

//将 lst0 插入到 lst1 前面生成一个新的集合
val lst4 = lst1.:::(lst0)

println(lst4)        // List(1, 2, 3, 4, 5, 6)


序列常用操作

构建列表

使用 :: 及 Nil 进行列表构建

val lst = 1 :: (2 :: (3 :: (4 :: Nil)))

// :: 操作符的优先级是从右往左,因此也可以这样写
val lst=1::2::3::4::Nil        // List(1, 2, 3, 4)

判断是否为空

lst.isEmpty        // false

 取第一个无素

lst.head            // 1

取除第一个元素外剩余的元素,返回的是列表

lst.tail            // List(2, 3, 4)

取列表第二个元素

lst.tail.head            // 2

取列表最后一个元素

nums.last            // 4

取除最后一个元素外的元素,返回的是列表

nums.init            // List(1, 2, 3)

List 连接操作

List(1,2,3):::List(4,5,6)        // List(1, 2, 3, 4, 5, 6)

列表元素倒置

nums.reverse            // List(4, 3, 2, 1)

一些方法调用

nums.reverse.reverse==nums        // true

nums.reverse.init                // List(4, 3, 2)

scala> nums.tail.reverse        // List(4, 3, 2)

丢弃前 n 个元素

lst.drop(1)            // List(2, 3, 4)

lst drop(2)            // List(3, 4)

lst drop 3             // List(4)

获取前 n 个元素

lst take 1             // List(1)

lst.take(3)            // List(1, 2, 3)

将列表进行分割

lst.splitAt(2)                // (List(1, 2),List(3, 4))

(lst.take(2),lst.drop(2))     // (List(1, 2),List(3, 4))

Zip 操作

var lst0=List(1,2,3,4)            // List(1, 2, 3, 4)

val chars=List('1','2','3','4')   // List(1, 2, 3, 4)

//返回的是 List 类型的元组(Tuple)
lst0 zip chars    // List[(Int, Char)] = List((1,1), (2,2), (3,3), (4,4))

toString

lst.toString            // String = List(1, 2, 3, 4)

mkString

lst.mkString            // 1234

转换成数组
 

nums.toArray            // Array(1, 2, 3, 4)

排序插入算法实现

  // 排序
  def isort(xs: List[Int]): List[Int] = {
    if (xs.isEmpty) Nil
    else insert(xs.head, isort(xs.tail))
  }

  // 插入
  def insert(x: Int, xs: List[Int]): List[Int] = {
    if (xs.isEmpty || x <= xs.head)
      x :: xs
    else 
      xs.head :: insert(x, xs.tail)
  }


可变序列

import scala.collection.mutable._

1. 构建可变列表

// 初始 3 个元素 1,2,3
val lst = ListBuffer[Int](1,2,3) 

创建空的可变列表

val lst = new ListBuffer[Int]

2. 追加

// 向 lst 中追加元素,注意:没有生成新的集合
lst += 4
lst.append(5)

// 将 lst1 中的元素追加到 lst0 中,注意:没有生成新的集合
lst0 ++= lst1

//将元素追加到 lst0 的后面生成一个新的集合
val lst3 = lst0 :+ 5 

3. 合并

// 将 lst0 和 lst1 合并成一个新的 ListBuffer 注意:生成了一个集合
val lst2= lst0 ++ lst1

 

Scala中,List是一种不可变的序列,它是一种线性递归数据结构,每个列表要么是空的(表示为Nil),要么是一个包含元素和另一个列表(尾部)的组合(表示为element :: tail)。在Spark中使用ScalaList与在Scala普通环境中使用List并无太大区别,因为Spark对Scala原生的数据结构提供了良好的支持。 List在Spark中的使用场景通常包括数据预处理、传递小规模的数据集或者作为算法的输入。例如,可以在Spark的RDD操作中使用List来创建初始数据集。 创建List的基本方式包括使用列表字面量语法或者使用列表构造函数: ```scala // 使用列表字面量 val list1 = List(1, 2, 3) // 使用列表构造函数 val list2 = 1 :: 2 :: 3 :: Nil ``` List支持很多操作,例如: - `head` - 返回列表的第一个元素。 - `tail` - 返回除了第一个元素之外的列表。 - `isEmpty` - 检查列表是否为空。 - `::` - 创建一个新列表,前一个元素作为头部,后一个列表作为尾部。 - `map` - 对列表中的每个元素应用给定的函数并返回一个新的列表。 - `filter` - 返回一个新的列表,这个列表只包含满足给定条件的元素。 - `reduce` - 从列表的第一个元素开始,依次应用给定的二元操作函数,归约整个列表到单一的值。 - `fold` - 与reduce类似,但是可以提供一个初始值,这个初始值在列表为空时作为结果返回。 在Spark中,你可以使用List来初始化一个RDD,例如: ```scala val sparkContext = ... // SparkContext实例 val listRDD = sparkContext.parallelize(List(1, 2, 3, 4)) ``` 这段代码创建了一个RDD,这个RDD包含元素1, 2, 3, 4,并且这个RDD可以在Spark集群上并行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

訾零

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

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

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

打赏作者

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

抵扣说明:

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

余额充值