我是一个教Scala的班级的老师助理。作为一项任务,我希望学生们实施一个arraylist课程。
在java中我写道:
public class ArrayList<T> implements List<T>{....}
我是否应该使用任何等效的List特征来实现arraylist?
答案 0 :(得分:3)
名称 ArrayList 表明您应该混合使用 IndexedSeq 。实际上你可能想得到 IndexedSeqLike 提供的所有好东西,即
class ArrayList[A] extends IndexedSeq[A] with IndexedSeqLike[A, ArrayList[A]]
这将为您提供 head , tail , take , drop , filter <的具体实现/ em>,等等。如果你还想要 map , flatMap 等(所有采用类型参数的方法)才能正常工作(返回 ArrayList [A] ),您还必须在随播对象中为 CanBuildFrom 提供类型类实例,例如
def cbf[A, B] = new CanBuildFrom[ArrayList[A], B, ArrayList[B]] {
// TODO Implementation!
}
答案 1 :(得分:2)
scala集合库非常复杂。有关继承的概述,请查看这些图片:
scala.collection.immutable:http://www.scala-lang.org/docu/files/collections-api/collections.immutable.png
scala.collection.mutable:http://www.scala-lang.org/docu/files/collections-api/collections.mutable.png
此外,scaladoc还可以很好地概述集合库的所有类和特征。
请注意,在Scala中,List是一个真正的列表,这意味着它是一个LinearSeq,在Java中,List更像是Scala中的IndexedSeq。
答案 2 :(得分:1)
在Scala中有许多接口。首先,它们在可变和不可变的中分开。在Java中,ArrayList基于一个数组 - 因此它是一个索引序列。在Scala中,此接口为IndexedSeq[A]
。由于ArrayList也是可变的,因此您可以选择scala.collection.mutable.IndexedSeq
,否则scala.collection.immutable.IndexedSeq
。您也可以选择scala.collection.mutable.Buffer
而不是mutable.IndexedSeq,这不能保证访问时间为O(1)。
如果您想要更具功能性的方法,可以选择Seq[A]
作为界面,或者Iterable[A]
,如果您希望能够实现更多的序列。
答案 3 :(得分:0)
那可能是Seq[T]
,也可能是IndexedSeq[T]
- 甚至是List[T]
。