33

这是No Scala mutable list的后续问题

我想在 Scala 中使用可变列表。我可以选择

哪个很好,但是什么是“标准”,推荐的,惯用的 scala 方式?我只想使用一个可以在后面添加内容的列表。

就我而言,我使用的是 HashMap,其中“列表”(我的意思是一般意义上的)将在价值方面。然后,我从文件中读取一些内容,对于每一行,我想在哈希图中找到正确的列表并将值附加到列表中。

4

4 回答 4

36

取决于你需要什么。

DoubleLinkedList是一个链表,允许您来回遍历节点列表。使用其prevnext引用分别转到上一个或下一个节点。

LinkedList是一个单链表,所以没有prev指针——如果你一直只遍历到列表的下一个元素,这就是你所需要的。

编辑:请注意,以上两个是为了在内部用作更复杂的列表结构的构建块,例如MutableList支持有效追加的 s 和mutable.Queues.

上面的两个集合都有线性时间追加操作。

ListBuffer是一个缓冲区类。尽管它由单链表数据结构支持,但它不会将next指针暴露给客户端,因此您只能使用迭代器和foreach. 然而,它的主要用途是作为缓冲区和不可变列表构建器 - 您通过 向其添加元素+=,当您调用 时result,您可以非常有效地返回一个函数式immutable.List. 与可变和不可变列表不同,追加和前置操作都是恒定时间的 - 您可以+=非常有效地在末尾追加。

MutableList内部使用,一般不使用,除非你打算基于单链表数据结构实现自定义集合类。例如,可变队列继承了这个类。MutableList类还具有高效的恒定时间追加操作,因为它维护对列表中最后一个节点的引用。

于 2012-06-15T10:54:32.050 回答
21

为了读者访问这个老问题:文档的具体可变集合类部分概述了可变列表类,包括何时使用哪一个的解释。

于 2015-09-22T16:09:07.020 回答
11

如果要附加项目,则根本不应该使用 a ListList当您想预先添加项目时,s 很好。改为使用ArrayBuffer

于 2012-06-15T10:54:35.643 回答
2

我只想使用一个可以在后面添加内容的列表。

然后选择实现的东西Growable。我个人建议其中一种Buffer实现。

我远离LinkedListand DoubleLinkedList,因为它们主要作为其他集合的底层实现存在,但在 Scala 2.9.x 之前有很多错误。从 Scala 2.10.0 开始,我预计各种错误修复已使它们达到标准。尽管如此,它们仍缺乏人们期望的一些方法,例如+=,您可以在基于它们的集合中找到这些方法。

于 2012-06-15T13:44:14.490 回答