无法附加到scala的可变LinkedList?

时间:2011-11-09 05:58:35

标签: scala scala-collections mutable

我正在查看API并且:+方法返回一个新的LinkedList。 append方法只允许附加另一个链表。 + =方法需要var才能工作。如果LinkedList是可变的,为什么有人会需要这些?这有什么疯狂的呢?

如果我在Java中有这样的东西

final LinkedList myList = new LinkedList<String>();
mylist.add("balh");

如何在Scala中实现相同的功能?

4 个答案:

答案 0 :(得分:10)

如果append只能使用LinkedList,那么为什么不使用

mylist append LinkedList("something")

mylist append LinkedList(otherContainer: _*)

我认为,LinkedList中只允许其他append s是有原因的,因为这可以保证以下内容:

l1 = LinkedList(1, 2, 3)
l2 = LinkedList(4)
l3 = LinkedList(5)

l1 append l2
// l1 == LinkedList(1, 2, 3, 4)
// l2 == LinkedList(4)

l2 append l3
// l1 == LinkedList(1, 2, 3, 4, 5)
// l2 == LinkedList(4, 5)
// l3 == LinkedList(5)

答案 1 :(得分:7)

您可以使用Buffer构建您的值,并使用mapResult在数据结构中将其转换。

//Create a buffer which will build a linked list
val buf = new ArrayBuffer[String]  mapResult { xs => LinkedList( xs:_* ) }

//You can append elements with +=, it is overriden to allow its use on a val
buf += "Something"
buf += "else"

//At the end you get your list
val lst = buf.result

// lst ==  LinkedList(Something, else) 

答案 2 :(得分:3)

可变性在列表中的实际元素上,而不在列表具有的结构上(持久性)。这也在scaladoc中说明。

如果每次返回一个新的List不是你想要的,并且你不能使用var,你总是可以使用Java LinkedList

val mylist = new java.util.LinkedList[String]
mylist add "something"

如果可能的话,我会坚持使用Scala列表。

答案 3 :(得分:2)

首先,请多关注一下这些文档:

  

此类实现单链表所在的头部(elem)   并且尾巴(下一个)是可变的。

所以它给你的是可变的headtail。这些操作通过三种方法表示:

  • appendinsert更改tail,因此他们会收到LinkedList作为参数
  • update更改元素的head

如果您想要一个可以成长的课程,请查看扩展Growable的课程。