跳至主要内容

Scala 中的列表

了解什么是列表,以及如何在 Scala 编程语言中加以利用。
· 6分钟 阅读

使用 AI 探索

您可能还对以下教程感兴趣:

引言

List (abstract data type)
来源:Wikipedia - List (abstract data type)

一个单向链表结构,包含 3 个整数元素(来源:Wikipedia - List (abstract data type))。

一般而言,列表是一种抽象数据类型序列,表示固定数量的值。值可以由程序以编程方式操作,并且在列表中可以出现多次。上图展示了一个列表的实例:由三个整数值组成的单向链表。列表也被视为一种数据结构,其中一个示例就是链表。

许多编程语言都支持列表,其中使用最广泛的之一是 Python。列表通常可以通过按顺序写出各项,并用逗号、分号或空格分隔,并放在一对定界符内来构造,例如圆括号 ()、方括号 []、花括号 {} 或尖括号 <>。某些语言(如 Python)允许像数组类型那样对列表类型进行索引或切片,在这种情况下,该数据类型更准确地被描述为数组(来源:Wikipedia - List (abstract data type))。

在 Scala 中,列表是一种包含不可变数据的集合,这意味着一旦创建就无法更改。在 Scala 中,List 表示的是链表。

在 Scala 的列表中,每个元素不必具有相同的数据类型。Scala 列表的实现会在构造阶段在内部使用可变状态。在 Scala 中,List 定义在 scala.collection.immutable 包下,因此它们是不可变的。最后,Scala 的 List 提供了多种方法,如 add、prepend、max、min 等。

定义 Scala List 的语法

val variable_name: List[type] = List(item1, item2, item3) 或 val variable_name = List(item1, item2, item3)。在 Scala 中,List 与数组非常相似。然而,Scala 的 List 是不可变的,并且表示链表数据结构。另一方面,Scala 数组是扁平且可变的。

让我们通过一个示例快速理解上述区别。

Scala List 与 Scala Array

首先在 Scala 中定义一个数组。

然后您将在第 1 个索引位置修改一个值(Scala 数组从 0 开始索引),看看是否可以更新。

Scala Array

由上面的代码片段可以看出,Scala 数组确实允许您修改第 1 个索引处的值。

现在,定义一个 Scala List,并尝试复现上述操作。

Scala List

从上述示例可以得出结论:由于 Scala 的 List 是不可变的,尝试更新其值会导致错误。

Scala List 方法

  • head:返回 Scala 列表的第一个元素。

  • tail:返回除第一个元素外的所有元素。

  • isEmpty:检查列表是否为空;若为空返回 True,否则返回 False。

  • fill():创建由零个或多个指定元素副本组成的统一列表。

  • reverse:将列表元素反转。

  • $:::$ 或 $.:::$ 或 .concat():连接两个或多个列表。

  • tabulate():可以按表格方式生成列表。其思想与 fill() 方法类似,但与 fill() 不同,它接收两个参数。第一个参数给出要创建的列表的维度,第二个参数描述列表的元素,这些元素由函数计算得到。

如果上述某些方法目前对您来说不太直观,不必担心,接下来您将通过示例在 Scala 中实现它们。但在此之前,让我们先学习如何定义 Scala 的 List。

您将使用 字符串、整数(1D 与 2D) 数据类型来创建 Scala List。您还将学习如何创建同时包含字符串和整数的列表。

一维整数列表

1-D Integer List

一维混合列表(整数与字符串)

1-D List with both Integer and String

一维字符串列表

1-D String List

二维列表

2-D List

对列表进行算术运算

在本例中,您将使用列表而不是仅定义变量。与变量不同,List 可以容纳 n 个值;您将对两个列表执行算术运算,而不是对两个变量。

下面我们快速看看如何实现。

为便于应用算术运算,您将使用紧随列表 x 和 y 的 zipped.map 函数。然后在 zipped.map 方法中以参数形式指定您想要执行的运算。

Arithmetic Operation on Lists
Arithmetic Operation on Lists

最后,让我们编写一段包含所有这些方法的代码。

object Scala_List_Methods
{

def main(args: Array[String])
{
    // define two lists
    val x = List(1, 40, 10)
    val y = List(20, 25, 30)
    val z = List("DataCamp", "Tutorials", "Are", "The", "Best")

    //Head
    println();
    println("Head of list x, y, z = " + (x.head, y.head, z.head));
    println();

    //Tail
    println("Tail of list x, y, z = " + (x.tail, y.tail, z.tail));
    println();

    //isEmpty
    println("Is list x, y, z empty? = " + (x.isEmpty, y.isEmpty, z.isEmpty));
    println();

    //Concatenate
    println("Concatenating x, y, z lists with the first method = " + (x:::y:::z));
    println("Concatenating x, y, z lists with the second method = " + ((x).:::(y).:::(z)));
    println("Concatenating x, y, z lists with the third method = " + (List.concat(x,y,z)));
    println();

    //Reverse
    println("Reverse of x, y, z is = " + (x.reverse, y.reverse, z.reverse));
    println();

    //Fill
    println("Output of Fill method is = " + (List.fill(5)(z)));
    println();

    //Tabulate
    println("Output of Tabulate method is = " + (List.tabulate(5)(x => x * x * x)));
}
}
Arithmetic Operation on Lists

结语

恭喜您完成本次 Scala 教程。

如对本教程有任何疑问,欢迎在下方评论区提问。

主题