我正在查看API并且:+方法返回一个新的LinkedList。 append方法只允许附加另一个链表。 + =方法需要var才能工作。如果LinkedList是可变的,为什么有人会需要这些?这有什么疯狂的呢?
如果我在Java中有这样的东西
final LinkedList myList = new LinkedList<String>();
mylist.add("balh");
如何在Scala中实现相同的功能?
答案 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) 并且尾巴(下一个)是可变的。
所以它给你的是可变的head
和tail
。这些操作通过三种方法表示:
append
和insert
更改tail
,因此他们会收到LinkedList
作为参数update
更改元素的head
。如果您想要一个可以成长的课程,请查看扩展Growable
的课程。