Dire che ho un set di stringhe che voglio essere ordinato per lunghezza ma unico per la normale unicità String
. Quello che voglio dire è che io potrei avere più di una stringa della stessa lunghezza nel Set
, ma che dovrebbero essere ordinati per lunghezza.Scala SortedSet - ordinati per un ordine e unici per qualcos'altro?
voglio esprimere l'ordine in questo modo:
val orderByLength = Ordering[Int].on[String](_ length)
che a mio avviso sembra davvero bello. Ma se dovessi buttare questo in un SortedSet, diciamo così:
scala> val s = SortedSet("foo", "bar")(orderByLength)
s: scala.collection.immutable.SortedSet[java.lang.String] = TreeSet(bar)
ho solo 'bar'. Questo perché Ordering
rappresenta un ordinamento totale e quindi quando compare
restituisce 0 gli elementi sono considerati identici.
Quindi penso che ho bisogno di fare un ordine incatenato e confrontare le stringhe se le lunghezze sono uguali. Per fare questo ho usato il -pattern "pimp my library" come questo:
trait ChainableOrderings {
class ChainableOrdering[T](val outer: Ordering[T]) {
def ifEqual(next: Ordering[T]): Ordering[T] = new Ordering[T] {
def compare(t1: T, t2: T) = {
val first = outer.compare(t1, t2)
if (first != 0) first else next.compare(t1, t2)
}
}
}
implicit def chainOrdering[T](o: Ordering[T]) = new ChainableOrdering[T](o)
}
che posso usare come:
val ordering = Ordering[Int].on[String](_ length) ifEqual Ordering[String]
ho pensato che sembrava davvero grande, ma poi ho capito che quello che ho il desiderio di fare non era proprio quello di ordinare dall'ordinamento naturale delle stringhe, volevo solo ordinare per dimensione, ma unicità per qualcos'altro. È possibile in un modo più elegante?
Un set contiene solo oggetti distinti. Un set ordinato ha un ordine totale. In particolare, 'S contiene a' e' S contiene b' significa che 'a
Eccellente! È molto più conciso della mia versione. –
@rex Forse sarebbe utile con un set preordinato (http://en.wikipedia.org/wiki/Preorder). Dì un albero redblack per l'ordine fornito con le foglie di Hashset per l'ordinamento/equivalenza naturale del tipo. Almeno la mia intuizione era che l'ordine ordinato sarebbe stato usato solo per l'ordinamento e non per cercare l'equivalenza, non so perché. –