8
votes

Liste d'écoute d'insertion

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: xxx

et ceci est un exemple de dont j'ai besoin: xxx

mise à jour: < p> "commandé" est une "insertion ordonnée" pour moi. J'ai besoin de cela: xxx


1 commentaires

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.


6 Réponses :


0
votes

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 , tel que immutable.treseset .


3 commentaires

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é.



4
votes

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


2 commentaires

Oui !, N'est-ce pas commandé. Pourquoi?


@ isola009 a définir n'est pas commandé. A listtset est un SET sauvegardé par une liste et le moyen optimal d'ajouter des trucs à une liste est compensée éléments. Par conséquent, le dernier élément ajouté à la liste Backing the Set sera le premier élément de cette liste , ce qui provoque le comportement que vous voyez quand vous Utilisez itérateur .



16
votes

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.)


2 commentaires

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



5
votes
var eti = a.toList.reverse.iterator

0 commentaires

1
votes
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
  }

}

0 commentaires

2
votes

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


2 commentaires

Il y a aussi une file d'attente immuable scala.collection.immauttable.Queue


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.