首页 文章

Scala集合不一致

提问于
浏览
5

为什么Scala Collections API中的集合和列表之间缺乏一致性?

例如,存在不可变的Set,但也是可变的Set . 如果我想使用后者,我可以简单地这样做:

val set = Set[A]()
set += new A

但是,本身没有可变列表 . 如果我想使用Lists编写类似的代码片段,使用哪种数据结构? LinkedList听起来很好,因为它是可变的,但没有定义=方法 . ListBuffer似乎满足要求,但它不是一个列表 .

阅读2.8 Collections文档后,我得出结论MutableList可能是最合适的 .

我仍然希望有scala.collection.mutable.List .

5 回答

  • 20

    这样做的原因是Java已经选择了函数 List 类型来表示它不是(即 java.util.List 不是列表) .

    对于函数式编程语言来说,拥有一个可变的 List 可能没有任何意义,因为这样的类型是矛盾的 . 因此 ListBufferArrayBuffer . 或者只使用 IndexedSeq ,其中有可变和不可变的实现

  • 9

    Scala集合库中 Set 的序列/列表类似物是 Seq . List 只是 Seq 的一个特定的,不可变的实现, Vector 也是如此 . ArrayBufferListBuffermutable.Seq 的典型实现 .

  • 3

    ArraySeq可能就是你要找的东西,除了=特别慢 . 您还可以使用java.util.ArrayList并导入collection.JavaConversions._

    似乎Scala缺少一个具有恒定时间索引的类似List的可变集合(如java的ArrayList) .

    在任何情况下,请注意“List”指的是“scala.immutable.List”类型 . 因此,如果要对不可变/可变集合进行概括,则Seq(或其他一些更抽象的集合类型)是您在方法中应该期望的类型而不是“List” .

    更理想的是需要一个IndexedSeq,这意味着索引操作对该集合具有高效性 . 但是,我不确定ListBuffer是否属于该类别 .

  • 0

    因为 Set 只是一个特征 - 它是抽象的并且需要实现 . 所以可以说 mutable.Setimmutable.Set 这样的类 .

    同时, List 是一个类,是(抽象)特征 immutable.LinearSeq 的一个实现 . 永远不会有任何其他类也是 List . 但是,你会发现有一个 mutable.LinearSeq 特征 .

    在Java术语中,您将接口与类进行比较 - 它们是不同的 .

  • 2

    别忘了 scala.collection.mutable.{LinkedList,DoubleLinkedList} . 它们是可变的,它们是 LinearSeq . 变异有点奇怪 - 您可以通过分配 elem 引用来修改头部,并通过分配 next 引用来修改尾部 .

    例如,此循环将所有负值更改为零 .

    val lst = collection.mutable.LinkedList(1, -2, 7, -9)
    var cur = lst
    while (cur != Nil) { 
      if (cur.elem < 0) cur.elem = 0
      cur = cur.next 
    }
    

    此循环从列表中删除每个第二个元素 .

    var cur = lst
    while (cur != Nil && cur.next != Nil) { 
      cur.next = cur.next.next
      cur = cur.next 
    }
    

    我并不是说这些比不可变列表更好 . 我只是指出Scala有可变列表,看起来与您在数据结构类中看到的非常相似 .

相关问题