Ce n'est pas un tableau, mais voici une implémentation d'IndexedSeq immuable à base de One que j'ai récemment créée. J'ai suivi l'exemple donné here où ils implémenter une classe d'ARN. Entre cet exemple, les ScalaDocs, et beaucoup d'erreurs de compilation "utiles", j'ai réussi à le configurer correctement. Le fait que OneBasedSeq soit générique le rend un peu plus complexe que l'exemple de l'ARN. En outre, en plus des traits étendus et des méthodes surchargées dans l'exemple, j'ai dû étendre IterableLike
et remplacer la méthode iterator
, car diverses méthodes appellent cette méthode en arrière-plan, et l'itérateur par défaut est basé sur zéro.
Veuillez pardonner toutes les bizarreries stylistiques ou idiomadiques; Je programme à Scala depuis moins de 2 mois.
import collection.{IndexedSeqLike, IterableLike}
import collection.generic.CanBuildFrom
import collection.mutable.{Builder, ArrayBuffer}
// OneBasedSeq class
final class OneBasedSeq[T] private (s: Seq[T]) extends IndexedSeq[T]
with IterableLike[T, OneBasedSeq[T]] with IndexedSeqLike[T, OneBasedSeq[T]]
{
private val innerSeq = s.toIndexedSeq
def apply(idx: Int): T = innerSeq(idx - 1)
def length: Int = innerSeq.length
override def iterator: Iterator[T] = new OneBasedSeqIterator(this)
override def newBuilder: Builder[T, OneBasedSeq[T]] = OneBasedSeq.newBuilder
override def toString = "OneBasedSeq" + super.toString
}
// OneBasedSeq companion object
object OneBasedSeq {
private def fromSeq[T](s: Seq[T]) = new OneBasedSeq(s)
def apply[T](vals: T*) = fromSeq(IndexedSeq(vals: _*))
def newBuilder[T]: Builder[T, OneBasedSeq[T]] =
new ArrayBuffer[T].mapResult(OneBasedSeq.fromSeq)
implicit def canBuildFrom[T, U]: CanBuildFrom[OneBasedSeq[T], U, OneBasedSeq[U]] =
new CanBuildFrom[OneBasedSeq[T], U, OneBasedSeq[U]] {
def apply() = newBuilder
def apply(from: OneBasedSeq[T]): Builder[U, OneBasedSeq[U]] = newBuilder[U]
}
}
// Iterator class for OneBasedSeq
class OneBasedSeqIterator[T](private val obs: OneBasedSeq[T]) extends Iterator[T]
{
private var index = 1
def hasNext: Boolean = index <= obs.length
def next: T = {
val ret = obs(index)
index += 1
ret
}
}
Bravo pour ajouter des liens vers des informations pour répondre à la plus grande question, non seulement celui demandé^_^ –
@Dylan juste répondu « Y at-il d'autres ressources qui aident à expliquer les collections s'étendant? » :) – pedrofurla