Trier un tableau en Scala

Suraj P 8 octobre 2023
  1. Utiliser la méthode sorted pour trier un tableau dans Scala
  2. Utilisez la méthode sortBy(attribute) pour trier un tableau dans Scala
  3. Utiliser la méthode sortWith pour trier un tableau dans Scala
Trier un tableau en Scala

Dans cet article, nous allons apprendre à trier un tableau de données dans le langage de programmation Scala.

Le tri consiste à organiser les données par ordre croissant ou décroissant en fonction de certaines conditions. C’est une méthode très couramment utilisée lorsque nous voulons rechercher quelque chose dans un grand ensemble de données, car nous pouvons appliquer l’algorithme de recherche binaire, qui ne fonctionne que sur l’ensemble de données trié.

Les méthodes de tri Scala utilisent en interne TimSort, un hybride d’algorithme de tri par fusion et par insertion. Examinons maintenant trois méthodes de tri présentes dans Scala.

Utiliser la méthode sorted pour trier un tableau dans Scala

La méthode sorted est utilisée pour trier les séquences dans Scala comme List, Array, Vector et Seq. Cette méthode retourne une nouvelle collection triée par son ordre naturel.

Définition de la méthode :

def sorted[Y >:X] (implicit ord:Ordering[Y]): Repr

Ici, X fait référence au type d’élément que nous utilisons dans la collection. Repr est le type de collection proprement dite ayant les éléments.

Voyons un exemple :

object MyClass {

    def main(args: Array[String]) {

    val seq = Seq(12,3,78,90,1)
    println(seq.sorted)

    }
}

Production:

List(1, 3, 12, 78, 90)

Par défaut, le tri s’effectue par ordre croissant. Si nous voulons trier les données par ordre décroissant, nous pouvons utiliser la syntaxe :

sorted(Ordering.DataType.reverse)

Exemple de code :

object MyClass {

    def main(args: Array[String]) {

    val seq = Seq(12,3,78,90,1)
    println(seq.sorted(Ordering.Int.reverse))

    }
}

Production:

List(90, 78, 12, 3, 1)

Si nous voulons utiliser la méthode sorted pour trier les données en fonction d’un attribut d’une classe de cas, nous devons étendre le trait Ordered puis remplacer la méthode abstraite compare. A l’intérieur de la méthode compare, nous devons définir quel attribut nous voulons trier les objets de la classe case.

C’est ce qu’on appelle le tri de données personnalisé, c’est-à-dire spécifier nos conditions pour trier les données.

Exemple de code :

case class student(id: Int,name: String) extends Ordered[student]
{
    def compare(that: student) = this.name compare that.name
}

val obj1 = student(1, "tony")
val obj2 = student(2, "bruce")
val obj3 = student(3, "stark")

val studentList = List(obj1,obj2,obj3)

println(studentList.sorted)

Production:

List(student(2,bruce), student(3,stark), student(1,tony))

Dans le code ci-dessus, nous avons trié les objets en fonction de l’attribut name de la classe de cas student.

Utilisez la méthode sortBy(attribute) pour trier un tableau dans Scala

La méthode sortBy dans Scala peut trier en fonction d’un ou plusieurs attributs de classe. Cette méthode peut être utilisée si nous avons un champ de type Commande dans le champ d’application.

Ici, le tri par défaut est également croissant.

Définition de la méthode :

def sortBy[B](f: A => B)(implicit ord: Ordering[B]): Repr

Exemple de code :

case class employee(id: Int, name: String, salary: Double)

val obj1 = employee(1,"tony",12000.00)
val obj2 = employee(2,"bruce",11000.00)
val obj3 = employee(3,"stark",15000.00)

val empList = List(obj1,obj2,obj3)

println(empList.sortBy(_.name))

println(empList.sortBy(_.salary))

Production:

List(employee(2,bruce,11000.0), employee(3,stark,15000.0), employee(1,tony,12000.0))
List(employee(2,bruce,11000.0), employee(1,tony,12000.0), employee(3,stark,15000.0))

Dans le code ci-dessus, nous avons d’abord imprimé les données triées en fonction de l’attribut nom, et dans la deuxième déclaration d’impression, nous avons trié les données en fonction de l’attribut salaire.

Nous pouvons trier les données par ordre décroissant en modifiant un peu la méthode :

sortBy(_.attribute)(Ordering[data_type_of_attribute].reverse)

Exemple de code :

case class employee(id: Int, name: String, salary: Double)

val obj1 = employee(1,"tony",12000.00)
val obj2 = employee(2,"bruce",11000.00)
val obj3 = employee(3,"stark",15000.00)

val empList = List(obj1,obj2,obj3)

println(empList.sortBy(_.name)(Ordering[String].reverse))

Production:

List(employee(1,tony,12000.0), employee(3,stark,15000.0), employee(2,bruce,11000.0))

Nous avons trié les données en fonction de l’attribut name dans le code ci-dessus.

Cette méthode est également utile pour trier les données en fonction de plusieurs attributs ; cela fonctionne en triant les données en fonction du premier attribut. Si le premier attribut a les mêmes valeurs, il est trié en fonction du deuxième attribut.

Exemple de code :

case class employee(id: Int, name: String, salary: Double)

val obj1 = employee(1,"tony",12000.00)
val obj2 = employee(2,"bruce",11000.00)
val obj3 = employee(3,"stark",15000.00)
val obj4 = employee(4,"tony",9000.0)
val obj5 = employee(5,"stark",19000.0)
val obj6 = employee(6,"tony",10000.0)

val empList = List(obj1,obj2,obj3,obj4,obj5,obj6)

println(empList.sortBy((empList =>(empList.name,empList.salary))))

Dans la sortie, nous pouvons voir que si le nom est le même, alors les données sont triées en fonction de l’attribut salaire.

Production:

List(employee(2,bruce,11000.0), employee(3,stark,15000.0), employee(5,stark,19000.0), employee(4,tony,9000.0), employee(6,tony,10000.0), employee(1,tony,12000.0))

En utilisant cette méthode, on peut aussi trier une liste de tuples en fonction du premier ou du second élément. Vous trouverez ci-dessous un exemple de tri des tuples en fonction du deuxième élément.

Exemple de code :

val list = List(('b',60),('c',10),('a',40))

println(list.sortBy(_._2))

Production:

List((c,10), (a,40), (b,60))

De la même manière, nous pouvons également trier en fonction de leur premier élément.

Exemple de code :

val list = List(('b',60),('c',10),('a',40))

println(list.sortBy(_._1))

Production:

List((a,40), (b,60), (c,10))

Utiliser la méthode sortWith pour trier un tableau dans Scala

Le sortWith(function) est très utile lorsque nous voulons oublier les éléments de tri et de tri basés sur la fonction de comparaison donnée. Ainsi, nous pouvons transmettre n’importe quelle fonction de comparaison personnalisée.

Définition de la méthode :

def sortWith(lt: (X, X) => Boolean): Repr

Exemple de code 1 :

Ici, nous avons trié les employés du salaire le plus élevé au salaire le plus bas.

case class employee(id: Int, name: String, salary: Double)

val obj1 = employee(1,"tony",12000.00)
val obj2 = employee(2,"bruce",11000.00)
val obj3 = employee(3,"stark",15000.00)
val obj4 = employee(4,"naruto",200)

val empList = List(obj1,obj2,obj3,obj4)

println(empList.sortWith(_.salary > _.salary))

Production:

List(employee(3,stark,15000.0), employee(1,tony,12000.0), employee(2,bruce,11000.0), employee(4,naruto,200.0))

Exemple de code 2 :

Ici, nous passons notre fonction personnalisée dans la méthode sortWith.

case class employee(id: Int, name: String, salary: Double)

def sortBySalary(emp1 :employee,emp2:employee): Boolean =
{
    emp1.salary < emp2.salary
}

val obj1 = employee(1,"tony",12000.00)
val obj2 = employee(2,"bruce",11000.00)
val obj3 = employee(3,"stark",15000.00)
val obj4 = employee(4,"naruto",200)

val empList = List(obj1,obj2,obj3,obj4)

println(empList.sortWith((emp1,emp2) => sortBySalary(emp1,emp2)))

Production:

List(employee(4,naruto,200.0), employee(2,bruce,11000.0), employee(1,tony,12000.0), employee(3,stark,15000.0))

Nous avons trié les données par ordre croissant en fonction du salaire dans le code ci-dessus.

Auteur: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

Article connexe - Scala Array