使用哪个scala可变列表?

hrysbysz  于 2023-01-09  发布在  Scala
关注(0)|答案(4)|浏览(135)

这是No Scala mutable list的后续问题
我想在Scala中使用可变列表。我可以选择

  • 第一个月
  • scala.collection.mutable.LinkedList
  • scala.collection.mutable.ListBuffer
  • scala.collection.mutable.MutableList

这很好,但是什么是“标准的”,推荐的,惯用的scala方式呢?我只想使用一个列表,我可以在后面添加东西。
在我的例子中,我使用了一个HashMap,其中的“列表”(我指的是一般意义上的列表)将位于值端。然后,我从一个文件中阅读一些内容,对于每一行,我都希望在HashMap中找到正确的列表,并将值附加到列表中。

jdzmm42g

jdzmm42g1#

看你需要什么了。
DoubleLinkedList是一个链接列表,允许您来回遍历节点列表。使用其prevnext引用可分别转到上一个或下一个节点。
LinkedList是一个单向链表,所以没有prev指针--如果您一直只遍历到链表的下一个元素,那么这就是您所需要的。
编辑:请注意,上面两个是内部用作更复杂列表结构的构建块,如支持高效附加的MutableList s和mutable.Queue s。
上面的两个集合都有线性时间追加操作。
ListBuffer是一个buffer类,虽然它有一个单链表数据结构支持,但是它没有向客户端公开next指针,所以你只能使用迭代器和foreach来遍历它。然而,它的主要用途是作为一个缓冲区和一个不可变列表构建器--你通过+=向它添加元素,当你调用result时,你可以非常高效地得到一个有效的immutable.List。与可变和不可变列表不同,append和prepend操作都是恒定时间的--你可以非常高效地通过+=在最后追加。
MutableList在内部使用,除非您计划基于单向链接列表数据结构实现自定义集合类,否则通常不会使用它。例如,可变队列继承此类。MutableList类还具有高效的恒定时间附加操作,因为它维护对列表中最后一个节点的引用。

tag5nh1u

tag5nh1u2#

文档的Concrete Mutable Collection Classes页面(或2.12页面)概述了可变列表类,包括何时使用哪个类的解释。

ax6ht2ek

ax6ht2ek3#

如果你想添加项目,你根本不应该使用ListList在你想添加项目的时候是很好的。用ArrayBuffer代替。

qv7cva1a

qv7cva1a4#

我只是想用一个列表,我可以添加的东西在背面。
然后选择实现Growable的东西,我个人建议其中一个Buffer实现。
我不想谈LinkedListDoubleLinkedList,因为它们主要是作为其他集合的底层实现出现的,但在Scala 2.9.x之前有很多bug。从Scala 2.10.0开始,我希望各种bug修复已经使它们达到了标准。尽管如此,它们仍然缺少一些人们所期望的方法,比如+=,你可以在基于它们的集合中找到这些方法。

相关问题