哪个scala可变列表可以使用?

时间:2012-06-15 10:47:12

标签: scala scala-collections

这是No Scala mutable list

的后续问题

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

中选择

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

就我而言,我使用的是HashMap,其中“list”(我的意思是一般意义上说)将是有价值的。然后,我正在读取文件中的内容,并且对于每一行,我想在散列映射中找到正确的列表并将值附加到列表中。

4 个答案:

答案 0 :(得分:35)

取决于您的需求。

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

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

编辑:请注意,上面的两个内容是用于内部作为更复杂的列表结构的构建块,例如支持高效追加的MutableList,以及mutable.Queue s

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

ListBuffer是一个缓冲类。虽然它由单链表数据结构支持,但它不会向客户端公开next指针,因此您只能使用迭代器和foreach来遍历它。 但是,它的主要用途是作为缓冲区和不可变列表构建器 - 您通过+=向其添加元素,当您调用result时,您可以非常高效地返回功能immutable.List 。与可变列表和不可变列表不同,追加和前置操作都是常量时间 - 您可以通过+=非常有效地追加到最后。

MutableList在内部使用,除非您计划基于单链表数据结构实现自定义集合类,否则通常不会使用它。例如,可变队列继承此类。 MutableList类还有一个有效的常量时间追加操作,因为它维护了对列表中最后一个节点的引用。

答案 1 :(得分:17)

为了阅读这个老问题的读者:文档的Concrete Mutable Collection Classes部分概述了可变列表类,包括何时使用哪一个的解释。

答案 2 :(得分:9)

如果您想附加项目,则根本不应使用List。当你想要预先添加项目时List是好的。请改用ArrayBuffer

答案 3 :(得分:2)

  

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

然后选择实现Growable的内容。我个人建议Buffer实现之一。

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