Scala List(列表)

本文介绍了Scala中的List数据结构,包括声明、基本操作如head/tail/isEmpty,连接列表方法,以及List.fill和List.tabulate的使用。还展示了如何通过各种方法进行列表的遍历、修改和创建。

Scala List(列表)

1、声明赋值

Scala 列表类似于数组,它们所有元素的类型都相同,但是它们也有所不同:列表是不可变的,值一旦被定义了就不能改变,其次列表具有递归的结构(也就是链接表结构)而数组不是。

列表的元素类型 T 可以写成 List[T]

object Demo {
   def main(args: Array[String]) {
		// 字符串列表
		val strs: List[String] = List("I", "Love", "Scala")

		// 整型列表
		val nums: List[Int] = List(11, 22, 33, 44)

		// 空列表
		val empty: List[Nothing] = List()

		// 二维列表
		val dim: List[List[Int]] =
		   List(
			  List(1, 0, 0),
			  List(0, 1, 0),
			  List(0, 0, 1)
		   )
   }
}

构造列表的两个基本单位是 Nil 和 ::

Nil 也可以表示为一个空列表。

以上例子可以写成如下所示:

// 字符串列表
val strs = "I" :: ("Love" :: ("Scala" :: Nil))

// 整型列表
val nums = 11 :: (22 :: (33 :: (44 :: Nil)))

// 空列表
val empty = Nil

// 二维列表
val dim = (1 :: (0 :: (0 :: Nil))) ::
          (0 :: (1 :: (0 :: Nil))) ::
          (0 :: (0 :: (1 :: Nil))) :: Nil

2、列表基本操作

Scala列表有三个基本操作:

  • head 返回列表第一个元素
  • tail 返回一个列表,包含除了第一元素之外的其他元素
  • isEmpty 在列表为空时返回true

对于Scala列表的任何操作都可以使用这三个基本操作来表达。比如:

// 字符串列表
object Demo {
   def main(args: Array[String]) {
      val strs = "I" :: ("Love" :: ("Scala" :: Nil))
      val nums = Nil
      println( "第一个单词是 : " + strs.head )
      println( "除了第一个单词后是 : " + strs.tail )
      println( "查看列表 strs 是否为空 : " + strs.isEmpty )
      println( "查看 nums 是否为空 : " + strs.isEmpty )
   }
}
第一个单词是 : I
除了第一个单词后是 : List(Love, Scala)
查看列表 strs 是否为空 : false
查看 nums 是否为空 : false

3、连接列表

可以使用 ::: 运算符或 List.:::() 方法或 List.concat() 方法来连接两个或多个列表。实例如下:

object Demo {
  def main(args: Array[String]) {
      val str1 = "I" :: ("Love" :: ("Scala" :: Nil))
      val str2 = "Java" :: ("Bigdata" :: Nil)

      // 使用 ::: 运算符
      var newStr = str1 ::: str2
      println( "str1 ::: str2 : " + newStr )
     
      // 使用 List.:::() 方法
      newStr = str1.:::(str2)
      println( "str1.:::(str2) : " + newStr )

      // 使用 concat 方法
      newStr = List.concat(str1, str2)
      println( "List.concat(str1, str2) : " + newStr  )
   }
}
str1 ::: str2 : List(I, Love, Scala, Java, Bigdata)
str1.:::(str2) : List(Java, Bigdata, I, Love, Scala)
List.concat(str1, str2) : List(I, Love, Scala, Java, Bigdata)

4、List.fill()

使用 List.fill() 方法来创建一个指定重复数量的元素列表:

object Demo {
   def main(args: Array[String]) {
      val str = List.fill(8)("Scala") // 重复 Scala 8次
      println( "str : " + str  )

      val num = List.fill(10)(8)     // 重复元素 8, 10 次
      println( "num : " + num  )
   }
}
str : List(Scala, Scala, Scala, Scala, Scala, Scala, Scala, Scala)
num : List(8, 8, 8, 8, 8, 8, 8, 8, 8, 8)

5、List.tabulate()

List.tabulate() 方法是通过给定的函数来创建列表。

 

方法的第一个参数为元素的数量,可以是二维的,第二个参数为指定的函数,我们通过指定的函数计算结果并返回值插入到列表中,起始值为 0,比如:

object Demo {
  def main(args: Array[String]) {
    // 通过给定的函数创建 8 个元素
    val squares = List.tabulate(8)(n => n * n)
    println( "一维 : " + squares  )

    // 创建二维列表
    val mul = List.tabulate( 5,6 )( _ * _ )
    println( "多维 : " + mul  )
  }
}
一维 : List(0, 1, 4, 9, 16, 25, 36, 49)
多维 : List(List(0, 0, 0, 0, 0, 0), List(0, 1, 2, 3, 4, 5), List(0, 2, 4, 6, 8, 10), List(0, 3, 6, 9, 12, 15), List(0, 4, 8, 12, 16, 20))

6、List.reverse

用于将列表的顺序反转,比如:

object Demo {
  def main(args: Array[String]) {
    val str = "I" :: ("Love" :: ("Scala" :: Nil))
    println( "str 反转前 : " + str )
    println( "str 反转后 : " + str.reverse )
  }
}
str 反转前 : List(I, Love, Scala)
str 反转后 : List(Scala, Love, I)

7、Scala List 常用方法

1

def +:(elem: A): List[A]

为列表预添加元素

scala> val x = List(1)
x: List[Int] = List(1)

scala> val y = 2 +: x
y: List[Int] = List(2, 1)

scala> println(x)
List(1)
2

def ::(x: A): List[A]

在列表开头添加元素

3

def :::(prefix: List[A]): List[A]

在列表开头添加指定列表的元素

4

def :+(elem: A): List[A]

复制添加元素后列表。

scala> val a = List(1)
a: List[Int] = List(1)

scala> val b = a :+ 2
b: List[Int] = List(1, 2)

scala> println(a)
List(1)
5

def addString(b: StringBuilder): StringBuilder

将列表的所有元素添加到 StringBuilder

6

def addString(b: StringBuilder, sep: String): StringBuilder

将列表的所有元素添加到 StringBuilder,并指定分隔符

7

def apply(n: Int): A

通过列表索引获取元素

8

def contains(elem: Any): Boolean

检测列表中是否包含指定的元素

9

def copyToArray(xs: Array[A], start: Int, len: Int): Unit

将列表的元素复制到数组中。

10

def distinct: List[A]

去除列表的重复元素,并返回新列表

11

def drop(n: Int): List[A]

丢弃前n个元素,并返回新列表

12

def dropRight(n: Int): List[A]

丢弃最后n个元素,并返回新列表

13

def dropWhile(p: (A) => Boolean): List[A]

从左向右丢弃元素,直到条件p不成立

14

def endsWith[B](that: Seq[B]): Boolean

检测列表是否以指定序列结尾

15

def equals(that: Any): Boolean

判断是否相等

16

def exists(p: (A) => Boolean): Boolean

判断列表中指定条件的元素是否存在。

判断l是否存在某个元素:

scala> l.exists(s => s == "Hah")
res7: Boolean = true
17

def filter(p: (A) => Boolean): List[A]

输出符号指定条件的所有元素。

过滤出长度为3的元素:

scala> l.filter(s => s.length == 3)
res8: List[String] = List(Hah, WOW)
18

def forall(p: (A) => Boolean): Boolean

检测所有元素。

例如:判断所有元素是否以"H"开头:

scala> l.forall(s => s.startsWith("H")) res10: Boolean = false
19

def foreach(f: (A) => Unit): Unit

将函数应用到列表的所有元素

20

def head: A

获取列表的第一个元素

21

def indexOf(elem: A, from: Int): Int

从指定位置 from 开始查找元素第一次出现的位置

22

def init: List[A]

返回所有元素,除了最后一个

23

def intersect(that: Seq[A]): List[A]

计算多个集合的交集

24

def isEmpty: Boolean

检测列表是否为空

25

def iterator: Iterator[A]

创建一个新的迭代器来迭代元素

26

def last: A

返回最后一个元素

27

def lastIndexOf(elem: A, end: Int): Int

在指定的位置 end 开始查找元素最后出现的位置

28

def length: Int

返回列表长度

29

def map[B](f: (A) => B): List[B]

通过给定的方法将所有元素重新计算

30

def max: A

查找最大元素

31

def min: A

查找最小元素

32

def mkString: String

列表所有元素作为字符串显示

33

def mkString(sep: String): String

使用分隔符将列表所有元素作为字符串显示

34

def reverse: List[A]

列表反转

35

def sorted[B >: A]: List[A]

列表排序

36

def startsWith[B](that: Seq[B], offset: Int): Boolean

检测列表在指定位置是否包含指定序列

37

def sum: A

计算集合元素之和

38

def tail: List[A]

返回所有元素,除了第一个

39

def take(n: Int): List[A]

提取列表的前n个元素

40

def takeRight(n: Int): List[A]

提取列表的后n个元素

41

def toArray: Array[A]

列表转换为数组

42

def toBuffer[B >: A]: Buffer[B]

返回缓冲区,包含了列表的所有元素

43

def toMap[T, U]: Map[T, U]

List 转换为 Map

44

def toSeq: Seq[A]

List 转换为 Seq

45

def toSet[B >: A]: Set[B]

List 转换为 Set

46

def toString(): String

列表转换为字符串

下面展示了部分方法的使用:

 

object Demo {
  def main(args: Array[String]) {
    //1、
    // def +:(elem: A): List[A]
    //为列表预添加元素
    val x = List(1)
    val y = 2 +: x
    println(x)
    println(y)
    //2、
    // def ::(x: A): List[A]
    //在列表开头添加元素
    val a = List(11)
    val b = a.::(21)
    println(a)
    println(b)
    //3、
    // def :::(prefix: List[A]): List[A]
    //在列表开头添加指定列表的元素
    val aa = List(11)
    val bb = aa.:::(List(1,2,3,4))
    println(aa)
    println(bb)
    //4、
    // def :+(elem: A): List[A]
    //复制添加元素后列表。
    val c = List(4)
    val d = c :+List(44)
    println(c)
    println(d)
    //5、
    //def addString(b: StringBuilder): StringBuilder
    //将列表的所有元素添加到 StringBuilder
    val e = List(5,4,6)
    val sb = new StringBuilder()
    val f = e.addString(sb)
    println(sb)
    println(f)
    //6、
    // def addString(b: StringBuilder, sep: String): StringBuilder
    //将列表的所有元素添加到 StringBuilder,并指定分隔符
    val a1 = List(5,4,6)
    val b1 = new StringBuilder()
    val f1 = a1.addString(b1,",")
    println(f1)
    println(b1)
    //7、
    // def apply(n: Int): A
    //通过列表索引获取元素
    val a11 = List(5,4,6)
    val f11 = a11.apply(2)
    println(f11)
    //8、
    //def contains(elem: Any): Boolean
    //检测列表中是否包含指定的元素
    val a12 = List(5,4,6)
    println( a12.contains(4))
    //9、
    //def copyToArray(xs: Array[A], start: Int, len: Int): Unit
    //将列表的元素复制到数组中。
    val a13 = List(1,2,3,4,5,6,7,8)
    var z:Array[Int] = new Array[Int](8)
    a13.copyToArray(z)
    for (i <- z){
      println(z.toString)
    }
    //10、
    // def distinct: List[A]
    //去除列表的重复元素,并返回新列表
    val a14 = List(1,2,2,4,4,6,7,8)
    val b14= a14.distinct
    println(b14)
    //11、
    //def drop(n: Int): List[A]
    //
    //丢弃前n个元素,并返回新列表
    val a15 = List(1,2,2,4,4,6,7,8)
    val b15= a15.drop(2)
    println(a15)
    println(b15)
    //12、def dropRight(n: Int): List[A]
    //
    //丢弃最后n个元素,并返回新列表
    val a16 = List(1,2,2,4,4,6,7,8)
    val b16= a16.dropRight(2)
    println(a16)
    println(b16)
    //13、def dropWhile(p: (A) => Boolean): List[A]
    //
    //从左向右丢弃元素,直到条件p不成立
    val a17 = List("hhh","gggg","llll")
    val b17 = a17.dropWhile(s => s.length == 3)
    println(b17)

    val a18 = List(1,2,2,4,4,6,7,8)
    println(a18.init)
    //后续省略,可自模拟剩下方法的用法

  }
}
List(1)
List(2, 1)
List(11)
List(21, 11)
List(11)
List(1, 2, 3, 4, 11)
List(4)
List(4, List(44))
546
546
5,4,6
5,4,6
6
true
[I@880ec60
[I@880ec60
[I@880ec60
[I@880ec60
[I@880ec60
[I@880ec60
[I@880ec60
[I@880ec60
List(1, 2, 4, 6, 7, 8)
List(1, 2, 2, 4, 4, 6, 7, 8)
List(2, 4, 4, 6, 7, 8)
List(1, 2, 2, 4, 4, 6, 7, 8)
List(1, 2, 2, 4, 4, 6)
List(gggg, llll)
List(1, 2, 2, 4, 4, 6, 7)

 

Scala 提供了一套很好的集合实现,Scala 集合分为可变的和不可变的集合。可变集合可以在适当的地方被更新或扩展。也就是说你可以修改,添加,移除一个集合的元素。相比之下,不可变集合类永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。在默认的情况下,Scala 使用的是不可变的集合类。本实训介绍的也是基于不可变集合类。 常见的集合类有 List 列表、Set 集合、Map 映射和元组等。接下来我们将为大家介绍第一种集合---List 列表List列表简介 Scala List 列表可以存放重复元素,它有点像数组, 因为它们都是有序存储结构,而且列表中所有元素的类型都一样,但它又不同于数组: 1、列表(List)一旦被创建就不能改变其中的元素; 2、列表(List)底层的数据结构是链接表,而数组是一块连续的内存。 因为列表不可变,所以所有操作它的方法或者构造器都会创建一个新的列表。 定义列表(List) 定义列表有两种方式,分别是实例化 List 对象和构造符构造。 1.实例化 List 对象 我们使用 List[T] 来定义一个 T 类型的列表。T 可以是 String,Int 等基本数据类型,也可以是用户自己定义的类型。 下列代码定义了多种类型的列表: object ForDemo { def main(args: Array[String]): Unit = { // 整数列表 val list: Seq[Int] = List(4, 5, 6) // 字符串列表 val list1: Seq[String] =List("edu","coder") // 空列表 val list2=List() // 打印列表 println(list) println(list1) println(list2) } } 执行结果: List(4,5,6) List(edu, coder) List() 2.构造符构造 构造列表的两个基本元素是 Nil 和 ::。Nil 代表一个空列表。:: 的发音为“cons”,它可以把新元素组合到现有列表的最端,然后返回作为执行结果的新列表。 object ForDemo { def main(args: Array[String]): Unit = { // 整数列表 val list: Seq[Int] = 1 :: (2 :: (3 :: (4 :: Nil))) // 字符串列表 val list1: Seq[String] ="edu" :: ("coder" :: Nil) // 空列表 val list2=Nil // 打印列表 println(list) println(list1) println(list2) } } 执行结果: List(1, 2, 3, 4) List(edu, coder) List() 列表的常用操作 三个最基本的操作 Scala List 有三个基本操作: 方法名 说明 head 返回列表第一个元素 tail 返回一个列表,包含除了第一元素之外的其他元素 isEmpty 在列表为空时返回 true 这些最基本的操作可应用于任何 Scala List 列表。实例如下: object ForDemo { def main(args: Array[String]): Unit = { // 字符串列表 val list: Seq[String] ="腾讯":: ("百度" :: ("阿里" :: Nil)) // 打印列表 println("列表中第一家公司是:"+list.head) println("列表中除了第一家公司之外的公司是:"+list.tail) println("查看列表是否为空 :"+list.isEmpty) } } 执行结果: 列表中第一家公司是:腾讯 列表中除了第一家公司之外的公司是:List(百度, 阿里) 查看列表是否为空 :false 连接列表 使用 ::: 运算符或 List.:::() 方法来连接两个或多个列表。实例如下: object ForDemo { def main(args: Array[String]): Unit = { // 字符串列表 val list: Seq[String] ="腾讯":: ("百度" :: ("阿里" :: Nil)) // 整数列表 val list1=List(1,2) val list2=List(3,4) // 连接列表并打印 println(list1.:::(list2)) println(list1:::list2) } } 执行结果: List(3, 4, 1, 2) List(1, 2, 3, 4) 需要注意的是,上述两种连接方式的连接顺序是不一样的,另外,不同类型的列表是无法拼接的,比如代码中的字符串列表 list 和整数列表 list1 、list2 是无法连接的。 其他常用方法 方法 说明 +: 为列表添加一个元素,并返回一个新列表 contains 检测列表中是否包含某元素 distinct 去除重复元素,并返回一个新列表 示例: object ForDemo { def main(args: Array[String]): Unit = { // 整数列表 val list1=List(1,2) // 为列表添加元素2 val list2=2+:list1 println(list2) // 判断列表是否包含元素1 println(list2.contains(1)) // 去除列表重复元素 println(list2.distinct) } } 执行结果: List(2, 1, 2) true List(2, 1) 编程要求 仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,连接两个列表并对数据去重,具体要求如下: 接收给定的多行数据(例:4 \n 56 \n 5 \n -10 \n 10,其中第一个数代表列表长度,其余数代表具体值,\n 仅用来说明一个数与另一个数之间是换行,实际数据中并没有); 将接收到的数据添加进列表,并把该列表连接到列表 list 之后; 对连接后的集合数据去重,并输出去重后的集合。 测试说明 平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 例: 测试输入: 4 3 4 6 2 预期输出: List(2, 4, 5, 3, 6)
最新发布
06-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值