这是No Scala mutable list的后续问题
我想在Scala中使用可变列表。我可以选择
- 第一个月
scala.collection.mutable.LinkedList
scala.collection.mutable.ListBuffer
scala.collection.mutable.MutableList
这很好,但是什么是“标准的”,推荐的,惯用的scala方式呢?我只想使用一个列表,我可以在后面添加东西。
在我的例子中,我使用了一个HashMap,其中的“列表”(我指的是一般意义上的列表)将位于值端。然后,我从一个文件中阅读一些内容,对于每一行,我都希望在HashMap中找到正确的列表,并将值附加到列表中。
4条答案
按热度按时间jdzmm42g1#
看你需要什么了。
DoubleLinkedList
是一个链接列表,允许您来回遍历节点列表。使用其prev
和next
引用可分别转到上一个或下一个节点。LinkedList
是一个单向链表,所以没有prev
指针--如果您一直只遍历到链表的下一个元素,那么这就是您所需要的。编辑:请注意,上面两个是内部用作更复杂列表结构的构建块,如支持高效附加的
MutableList
s和mutable.Queue
s。上面的两个集合都有线性时间追加操作。
ListBuffer
是一个buffer类,虽然它有一个单链表数据结构支持,但是它没有向客户端公开next
指针,所以你只能使用迭代器和foreach
来遍历它。然而,它的主要用途是作为一个缓冲区和一个不可变列表构建器--你通过+=
向它添加元素,当你调用result
时,你可以非常高效地得到一个有效的immutable.List
。与可变和不可变列表不同,append和prepend操作都是恒定时间的--你可以非常高效地通过+=
在最后追加。MutableList
在内部使用,除非您计划基于单向链接列表数据结构实现自定义集合类,否则通常不会使用它。例如,可变队列继承此类。MutableList
类还具有高效的恒定时间附加操作,因为它维护对列表中最后一个节点的引用。tag5nh1u2#
文档的Concrete Mutable Collection Classes页面(或2.12页面)概述了可变列表类,包括何时使用哪个类的解释。
ax6ht2ek3#
如果你想添加项目,你根本不应该使用
List
。List
在你想添加项目的时候是很好的。用ArrayBuffer
代替。qv7cva1a4#
我只是想用一个列表,我可以添加的东西在背面。
然后选择实现
Growable
的东西,我个人建议其中一个Buffer
实现。我不想谈
LinkedList
和DoubleLinkedList
,因为它们主要是作为其他集合的底层实现出现的,但在Scala 2.9.x之前有很多bug。从Scala 2.10.0开始,我希望各种bug修复已经使它们达到了标准。尽管如此,它们仍然缺少一些人们所期望的方法,比如+=
,你可以在基于它们的集合中找到这些方法。