2012-03-13 86 views
1

我是一名教Scala的教師助理。作爲一項任務,我希望學生實施一個數學列表課程。在Scala中創建一個arraylist

在java中我這樣寫:

public class ArrayList<T> implements List<T>{....} 

有,我應該用它來實現的ArrayList任何等效名單特質?

回答

0

那將是Seq[T],或者可能是IndexedSeq[T] - 或者甚至List[T]

1

在斯卡拉有很多接口。首先,它們以可變和不可變的形式分開。在Java中ArrayList基於一個數組 - 因此它是一個索引序列。在斯卡拉這個接口是IndexedSeq[A]。因爲ArrayList也是可變的,所以您可以選擇scala.collection.mutable.IndexedSeq,否則scala.collection.immutable.IndexedSeq。除了mutable.IndexedSeq,您還可以選擇scala.collection.mutable.Buffer,這不保證訪問時間爲O(1)。

如果您想要更多功能的方法,您可以選擇Seq[A]作爲接口,或者如果您希望能夠實現多個序列,則可以使用Iterable[A]

2

斯卡拉集合庫非常複雜。有關繼承的概述看看這些圖片:

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

我認爲Scala ArrayBuffers的行爲與Java ArrayList相似。 – paradigmatic 2012-03-13 21:41:45

+0

'Scala中的Vector'是'IndexedSeq'的不可變樹實現; Java的'List'接口就像Scala的'Seq'特性 – 2012-03-13 22:12:43

+0

是的,你是對的,在我的答案中得到了糾正。 – drexin 2012-03-13 22:29:44

3

名稱ArrayList建議您應該混合使用IndexedSeq。事實上,你可能想通過IndexedSeqLike所提供的所有東西,即

class ArrayList[A] extends IndexedSeq[A] with IndexedSeqLike[A, ArrayList[A]] 

這讓你採取下降的具體實現,過濾如果你還想要地圖,flatMap等(所有的方法,採取類型參數)正常工作(返回ArrayList [A]),您還必須爲伴侶對象中的CanBuildFrom提供一個類型類實例,例如,

def cbf[A, B] = new CanBuildFrom[ArrayList[A], B, ArrayList[B]] { 
    // TODO Implementation! 
} 
相關問題