Ordenar un array en Scala

Suraj P 30 enero 2023
  1. Use el método sorted para ordenar un array en Scala
  2. Utilice el método sortBy(attribute) para ordenar un array en Scala
  3. Use el método sortWith para ordenar un array en Scala
Ordenar un array en Scala

En este artículo, aprenderemos cómo ordenar un array de datos en el lenguaje de programación Scala.

Ordenar se refiere a organizar los datos en orden ascendente o descendente en función de alguna condición. Es un método muy utilizado cuando queremos buscar algo en un conjunto de datos grande, ya que podemos aplicar el algoritmo de búsqueda binaria, que solo funciona en el conjunto de datos ordenado.

Los métodos de clasificación de Scala utilizan internamente TimSort, un híbrido de algoritmo de clasificación por fusión e inserción. Ahora, veamos tres métodos de clasificación presentes en Scala.

Use el método sorted para ordenar un array en Scala

El método sorted se utiliza para clasificar las secuencias en Scala como List, Array, Vector y Seq. Este método devuelve una nueva colección ordenada por su orden natural.

Definición del método:

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

Aquí, X se refiere al tipo de elemento que usamos en la colección. Repr es el tipo de colección real que tiene los elementos.

Veamos un ejemplo:

object MyClass {

    def main(args: Array[String]) {

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

    }
}

Producción :

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

De forma predeterminada, la clasificación se realiza en orden ascendente. Si queremos ordenar los datos en orden descendente, podemos usar la sintaxis:

sorted(Ordering.DataType.reverse)

Código de ejemplo:

object MyClass {

    def main(args: Array[String]) {

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

    }
}

Producción :

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

Si queremos usar el método sorted para ordenar los datos en función de algún atributo de una clase de caso, entonces tenemos que extender el rasgo Ordered y luego anular el método abstracto compare. Dentro del método compare, tenemos que definir qué atributo queremos ordenar los objetos de la clase case.

Esto se denomina clasificación personalizada de datos, es decir, especificar nuestras condiciones para clasificar los datos.

Código de ejemplo:

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)

Producción :

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

En el código anterior, hemos ordenado los objetos según el atributo name de la clase de caso student.

Utilice el método sortBy(attribute) para ordenar un array en Scala

El método sortBy en Scala puede ordenar en función de uno o más atributos de clase. Este método se puede utilizar si tenemos un tipo de campo Ordering en el alcance.

Aquí, la clasificación predeterminada también es ascendente.

Definición del método:

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

Código de ejemplo:

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

Producción :

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

En el código anterior, primero, imprimimos los datos ordenados según el atributo name, y en la segunda instrucción de impresión, ordenamos los datos según el atributo salary.

Podemos ordenar los datos en orden descendente ajustando un poco el método en:

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

Código de ejemplo:

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

Producción :

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

Ordenamos los datos según el atributo name en el código anterior.

Este método también es útil para clasificar datos en función de múltiples atributos; funciona ordenando los datos según el primer atributo. Si el primer atributo tiene los mismos valores, se ordena según el segundo atributo.

Código de ejemplo:

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

En el resultado, podemos ver que si el name es el mismo, los datos se ordenan según el atributo salary.

Producción :

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

Con este método, también podemos ordenar una lista de tuplas según el primer o el segundo elemento. A continuación se muestra un ejemplo de cómo ordenar las tuplas según el segundo elemento.

Código de ejemplo:

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

println(list.sortBy(_._2))

Producción :

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

De la misma manera, también podemos ordenar según su primer elemento.

Código de ejemplo:

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

println(list.sortBy(_._1))

Producción :

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

Use el método sortWith para ordenar un array en Scala

La sortWith(función) es muy útil cuando queremos olvidarnos de ordenar y ordenar elementos basados ​​en la función de comparación dada. Entonces, podemos pasar cualquier función de comparación personalizada.

Definición del método:

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

Código de ejemplo 1:

Aquí, hemos ordenado a los empleados de mayor a menor salario.

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

Producción :

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

Código de ejemplo 2:

Aquí, pasamos nuestra función personalizada en el método 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)))

Producción :

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

Hemos ordenado los datos en orden ascendente según el salary en el código anterior.

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

Artículo relacionado - Scala Array