118 votes

Manière idiomatique et facile de définir l'ordonnancement pour une simple classe de cas

J'ai une liste d'instances de classes de cas scala simples et je souhaite les imprimer dans un ordre prévisible et lexicographique en utilisant list.sorted, mais je reçois "Aucun ordre implicite défini pour ...".

Existe-t-il un implicite qui fournit un ordre lexicographique pour les classes de cas?

Existe-t-il un moyen idiomatique simple d'ajouter un ordre lexicographique à une classe de cas?

scala> case class A(tag:String, load:Int)
scala> val l = List(A("mots",50),A("article",2),A("lignes",7))

scala> l.sorted.foreach(println)
:11: erreur: Aucun ordre implicite défini pour A.
          l.sorted.foreach(println)
            ^

Je ne suis pas satisfait d'un 'hack' :

scala> l.map(_.toString).sorted.foreach(println)
A(article,2)
A(lignes,7)
A(mots,50)

5voto

Keith Pinson Points 531

Comme vous avez utilisé une case class, vous pourriez l'étendre avec Ordered de la manière suivante :

case class A(tag:String, load:Int) extends Ordered[A] { 
  def compare( a:A ) = tag.compareTo(a.tag) 
}

val ls = List( A("mots",50), A("article",2), A("lignes",7) )

ls.sorted

0voto

Sampat Kumar Points 124

Ma méthode préférée est d'utiliser la méthode SAM (Single abstraction method) avec 2.12 comme mentionné dans l'exemple ci-dessous :

case class Team(city:String, mascot:String)

//Créez deux choix pour trier par, ville et mascotte
object MyPredef3 {
  // Utilisé ci-dessous en 2.11
  implicit val teamsSortedByCity: Ordering[Team] = new Ordering[Team] {
    override def compare(x: Team, y: Team) = x.city compare y.city
  }

  implicit val teamsSortedByMascot: Ordering[Team] = new Ordering[Team] {
    override def compare(x: Team, y: Team) = x.mascot compare y.mascot
  }

  /*
     Utilisé ci-dessous en 2.12
     implicit val teamsSortedByCity: Ordering[Team] =
    (x: Team, y: Team) => x.city compare y.city
     implicit val teamsSortedByMascot: Ordering[Team] =
    (x: Team, y: Team) => x.mascot compare y.mascot

   */
}

object _6OrderingAList extends App {
  //Créez quelques équipes sportives
  val teams = List(Team("Cincinnati", "Bengals"),
    Team("Madrid", "Real Madrid"),
    Team("Las Vegas", "Golden Knights"),
    Team("Houston", "Astros"),
    Team("Cleveland", "Cavaliers"),
    Team("Arizona", "Diamondbacks"))

  //importez la règle implicite que nous voulons, dans ce cas la ville
  import MyPredef3.teamsSortedByCity

  //min trouve le minimum, puisque nous trions
  //par ville, Arizona gagne.
  println(teams.min.city)

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X