Ordenar un array en Scala
-
Use el método
sorted
para ordenar un array en Scala -
Utilice el método
sortBy(attribute)
para ordenar un array en Scala -
Use el método
sortWith
para 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.