我想在Scala中使用可变列表。我可以从
中选择scala.collection.mutable.DoubleLinkedList
scala.collection.mutable.LinkedList
scala.collection.mutable.ListBuffer
scala.collection.mutable.MutableList
哪个好,但是什么是“标准”,推荐的,惯用的scala方式?我只想使用一个可以在后面添加内容的列表。
就我而言,我使用的是HashMap,其中“list”(我的意思是一般意义上说)将是有价值的。然后,我正在读取文件中的内容,并且对于每一行,我想在散列映射中找到正确的列表并将值附加到列表中。
答案 0 :(得分:35)
取决于您的需求。
DoubleLinkedList
是一个链接列表,允许您在节点列表中来回遍历。使用其prev
和next
引用分别转到上一个或下一个节点。
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
实现之一。
我远离LinkedList
和DoubleLinkedList
,因为它们主要作为其他集合的底层实现存在,但是在Scala 2.9.x中有很多错误。从Scala 2.10.0开始,我希望各种错误修复使它们达到标准。尽管如此,他们缺少一些人们期望的方法,例如+=
,你可以在基于它们的集合中找到它们。