liste d'écoute (collection.immutable.listerSet) est un ensemble ordonné inversé. J'ai besoin d'un ensemble commandé. Ceci est un exemple de liste d'amis d'origine: et ceci est un exemple de dont j'ai besoin: p> mise à jour: p> < p> "commandé" est une "insertion ordonnée" pour moi. J'ai besoin de cela: p>
6 Réponses :
En réalité, ce n'est pas un ensemble commandé du tout. Si vous avez besoin d'une commande, utilisez une implémentation de immutable.sortedset code>
, tel que immutable.treseset code>
. p>
L'OP a précisé qu'il voulait dire "l'insertion-ordonnée" plutôt que "ordonnée".
@anov, je vois ça. Cependant, je ne connais pas une solution à la nouvelle version de la question.
Un jeu de tri est commandé mais un ensemble commandé n'est pas nécessairement trié.
Il n'est pas commandé:
val a = ListSet(3,1,2) val ite = a.iterator ite.next // returns 2 ite.next // returns 1 ite.next // returns 3
Oui !, N'est-ce pas commandé. Pourquoi?
@ isola009 a définir code> n'est pas commandé. A
listtset code> est un
SET code> sauvegardé par une liste
code> et le moyen optimal d'ajouter des trucs à une liste
code> est compensée éléments. Par conséquent, le dernier élément ajouté à la liste code> Backing the
Set code> sera le premier élément de cette liste
code>, ce qui provoque le comportement que vous voyez quand vous Utilisez
itérateur code>.
COLLECTION.MUTABLE.LIKEDHASHSETRE < / Code>
est un ensemble qui compte ses membres dans la même séquence qu'ils ont été insérés. (J'évite le terme "commandé" ici, car je préfère réserver cela aux cas d'une relation de commande sur les valeurs, pas la séquence particulière dans laquelle certaines actions ont été effectuées.) P>
Y a-t-il quelque chose de similaire mais immuable?
@ Isola009: Non. ... Consultez la bibliothèque API DOCS: Scala-Lang. Org / API / Current / Index.html
var eti = a.toList.reverse.iterator
import collection.SetLike import collection.generic.{CanBuildFrom, ImmutableSetFactory, GenericCompanion, GenericSetTemplate} @serializable @SerialVersionUID(2L) class OrderedListSet[A] extends Set[A] with GenericSetTemplate[A, OrderedListSet] with SetLike[A, OrderedListSet[A]] { override def companion: GenericCompanion[OrderedListSet] = OrderedListSet override def size: Int = 0 override def empty = OrderedListSet.empty[A] def iterator: Iterator[A] = Iterator.empty override def foreach[U](f: A => U): Unit = { } def contains(e: A): Boolean = get0(e) override def + (e: A): OrderedListSet[A] = updated0(e) override def + (elem1: A, elem2: A, elems: A*): OrderedListSet[A] = this + elem1 + elem2 ++ elems def - (e: A): OrderedListSet[A] = removed0(e) protected def get0(key: A): Boolean = false protected def updated0(key: A): OrderedListSet[A] = new OrderedListSet.OrderedListSet1(key) protected def removed0(key: A): OrderedListSet[A] = this protected val indexes:List[Int] = List[Int]() protected val nextIndex:Int = 1 def pairIterator:Iterator[(A,Int)] = Iterator.empty protected def writeReplace(): AnyRef = new OrderedListSet.SerializationProxy(this) protected def pairForeach[U](f: ((A,Int)) => U): Unit = { } } object OrderedListSet extends ImmutableSetFactory[OrderedListSet] { /** $setCanBuildFromInfo */ implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, OrderedListSet[A]] = setCanBuildFrom[A] override def empty[A]: OrderedListSet[A] = EmptyOrderedListSet.asInstanceOf[OrderedListSet[A]] private object EmptyOrderedListSet extends OrderedListSet[Any] { } class OrderedListSet1[A](private[OrderedListSet] var key: A) extends OrderedListSet[A] { override def size = 1 override val indexes = List[Int](1) override val nextIndex = indexes.head + 1 override def get0(key: A): Boolean = (key == this.key) override def updated0(key: A): OrderedListSet[A] = if (this.key == key) { this } else { val m = new EEOrderedListSet[A](List[A](this.key), indexes, nextIndex) m.updated0(key) } override def removed0(key: A): OrderedListSet[A] = if (key == this.key) OrderedListSet.empty[A] else this override def iterator = Iterator(key) override def pairIterator: Iterator[(A, Int)] = Iterator((key, indexes.head)) override def foreach[U](f: A => U): Unit = f(key) override def pairForeach[U](f: ((A,Int)) => U): Unit = f (key, indexes.head) } class EEOrderedListSet[A](private var elems: List[A], override protected[OrderedListSet] val indexes: List[Int], override protected[OrderedListSet] val nextIndex:Int) extends OrderedListSet[A] { override def size = elems.size override def get0(key: A): Boolean = elems.contains(key) override def updated0(key: A): OrderedListSet[A] = { if (elems contains key) { this } else { new EEOrderedListSet(elems.:+(key), indexes.:+(nextIndex), nextIndex+1) } } override def removed0(key: A): OrderedListSet[A] = { val r = elems findIndexOf (_ == key) if ( r != -1 ) { val e = elems filterNot (_ == key) val (i1, i2) = indexes splitAt r val i = i1 ++ i2.tail new EEOrderedListSet(e, i, nextIndex) } else { this } } override def iterator = elems.iterator override def pairIterator: Iterator[(A, Int)] = (elems zip indexes).iterator override def foreach[U](f: A => U): Unit = elems.foreach(f) override def pairForeach[U](f: ((A,Int)) => U): Unit = (elems zip indexes).foreach(f) } @serializable @SerialVersionUID(2L) private class SerializationProxy[A,B](@transient private var orig: OrderedListSet[A]) { private def writeObject(out: java.io.ObjectOutputStream) { val s = orig.size out.writeInt(s) for (e <- orig) { out.writeObject(e) } } private def readObject(in: java.io.ObjectInputStream) { orig = empty val s = in.readInt() for (i <- 0 until s) { val e = in.readObject().asInstanceOf[A] orig = orig + e } } private def readResolve(): AnyRef = orig } }
Si vous souhaitez récupérer vos éléments dans l'ordre dans lequel ils ont été insérés, vous avez besoin d'une collection de première sortie, utilisez simplement un File d'attente .
1 2 3 5 4
Il y a aussi une file d'attente immuable scala.collection.immauttable.Queue code>
Sauf que une file d'attente n'est pas un ensemble. Une file d'attente ne garantit pas l'unicité et l'égalité dépend de l'ordre d'itération.
On dirait que la liste d'écoute a été modifiée pour avoir la commande souhaitée maintenant, à partir de 2,13 et probablement 2.12 aussi.