【问题标题】:Can't append to scala's mutable LinkedList?不能附加到 scala 的可变 LinkedList?
【发布时间】:2011-11-09 05:58:34
【问题描述】:

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

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

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

如何在 Scala 中实现相同的目标?

【问题讨论】:

    标签: scala scala-collections mutable


    【解决方案1】:

    如果append 只能取一个LinkedList 那么为什么不使用

    mylist append LinkedList("something")
    

    mylist append LinkedList(otherContainer: _*)
    

    我认为,在append 中只允许其他LinkedLists 是有原因的,因为这保证了以下几点:

    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)
    

    【讨论】:

      【解决方案2】:

      您可以使用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) 
      

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

        • 请注意,java.util.LinkedList 是一个双向链表,与 Scala 的 LinkedList 不同。
        • 另一种选择是使用scala.collection.mutable.ListBuffer[A],然后在需要List 时使用.toList
        • @Debilski 在哪些方面有所不同?我问,因为在键入List(1, 2, 3) 时,我不明白 List Scala 提供了哪种实现。是单链表吗?还是双链表?
        • List (= scala.collection.immutable.List) 是一个不可变的单链表。
        【解决方案4】:

        首先,请多关注文档:

        这个类实现了单链表,其中头部(elem) 并且尾部(下一个)是可变的。

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

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

        如果您想要一个可以增长的类,请查看扩展 Growable 的类。

        【讨论】:

          猜你喜欢
          • 2013-03-23
          • 2018-08-17
          • 2011-03-28
          • 1970-01-01
          • 1970-01-01
          • 2011-01-24
          • 2015-12-16
          • 2021-11-27
          • 1970-01-01
          相关资源
          最近更新 更多