Sortieren ein Array in Scala
-
Verwenden Sie die
sorted
-Methode, um ein Array in Scala zu sortieren -
Verwenden Sie die Methode
sortBy(attribute)
, um ein Array in Scala zu sortieren -
Verwendung der Methode
sortWith
zum Sortieren eines Arrays in Scala
In diesem Artikel lernen wir, wie man ein Array von Daten in der Programmiersprache Scala sortiert.
Sortieren bezieht sich auf das Anordnen der Daten in aufsteigender oder absteigender Reihenfolge basierend auf einer bestimmten Bedingung. Es ist eine sehr häufig verwendete Methode, wenn wir etwas in einem großen Datensatz suchen möchten, da wir den binären Suchalgorithmus anwenden können, der nur auf dem sortierten Datensatz funktioniert.
Scala-Sortiermethoden verwenden intern TimSort, eine Mischung aus Merge-Sort- und Insertion-Sort-Algorithmus. Schauen wir uns nun drei Sortiermethoden an, die in Scala vorhanden sind.
Verwenden Sie die sorted
-Methode, um ein Array in Scala zu sortieren
Die sortierte
Methode wird verwendet, um die Sequenzen in Scala wie List, Array, Vector und Seq zu sortieren. Diese Methode gibt eine neue Sammlung zurück, die nach ihrer natürlichen Reihenfolge sortiert ist.
Methodendefinition:
def sorted[Y >:X] (implicit ord:Ordering[Y]): Repr
Hier bezieht sich X
auf die Art des Elements, das wir in der Sammlung verwenden. Repr
ist die Art der tatsächlichen Sammlung mit den Elementen.
Sehen wir uns ein Beispiel an:
object MyClass {
def main(args: Array[String]) {
val seq = Seq(12,3,78,90,1)
println(seq.sorted)
}
}
Ausgabe:
List(1, 3, 12, 78, 90)
Standardmäßig erfolgt die Sortierung in aufsteigender Reihenfolge. Wenn wir die Daten in absteigender Reihenfolge sortieren möchten, können wir die Syntax verwenden:
sorted(Ordering.DataType.reverse)
Beispielcode:
object MyClass {
def main(args: Array[String]) {
val seq = Seq(12,3,78,90,1)
println(seq.sorted(Ordering.Int.reverse))
}
}
Ausgabe:
List(90, 78, 12, 3, 1)
Wenn wir die Methode sorted
verwenden wollen, um die Daten basierend auf einem Attribut einer Fallklasse zu sortieren, müssen wir die Eigenschaft Ordered
erweitern und dann die abstrakte Methode compare
überschreiben. Innerhalb der compare
-Methode müssen wir definieren, nach welchem Attribut wir die Objekte der Case-Klasse sortieren wollen.
Dies wird als benutzerdefinierte Datensortierung bezeichnet, d. h. die Angabe unserer Bedingungen zum Sortieren der Daten.
Beispielcode:
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)
Ausgabe:
List(student(2,bruce), student(3,stark), student(1,tony))
Im obigen Code haben wir die Objekte nach dem Attribut name
der Fallklasse student
sortiert.
Verwenden Sie die Methode sortBy(attribute)
, um ein Array in Scala zu sortieren
Die Methode sortBy
in Scala kann nach einem oder mehreren Klassenattributen sortieren. Diese Methode kann verwendet werden, wenn wir einen Feldtyp Bestellung
im Geltungsbereich haben.
Auch hier ist die Standardsortierung aufsteigend.
Methodendefinition:
def sortBy[B](f: A => B)(implicit ord: Ordering[B]): Repr
Beispielcode:
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))
Ausgabe:
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))
Im obigen Code haben wir zuerst die sortierten Daten basierend auf dem Attribut name
gedruckt, und in der zweiten Druckanweisung haben wir die Daten basierend auf dem Attribut salary
sortiert.
Wir können die Daten in absteigender Reihenfolge sortieren, indem wir die Methode ein wenig anpassen in:
sortBy(_.attribute)(Ordering[data_type_of_attribute].reverse)
Beispielcode:
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))
Ausgabe:
List(employee(1,tony,12000.0), employee(3,stark,15000.0), employee(2,bruce,11000.0))
Wir haben die Daten basierend auf dem Attribut name
im obigen Code sortiert.
Diese Methode ist auch nützlich zum Sortieren von Daten basierend auf mehreren Attributen; Es funktioniert, indem es Daten basierend auf dem ersten Attribut sortiert. Wenn das erste Attribut dieselben Werte hat, wird es basierend auf dem zweiten Attribut sortiert.
Beispielcode:
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))))
In der Ausgabe sehen wir, dass bei gleichem name
die Daten nach dem Attribut Gehalt
sortiert werden.
Ausgabe:
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))
Mit dieser Methode können wir auch eine Liste von Tupeln
nach dem ersten oder zweiten Element sortieren. Unten ist ein Beispiel für das Sortieren der Tupel basierend auf dem zweiten Element.
Beispielcode:
val list = List(('b',60),('c',10),('a',40))
println(list.sortBy(_._2))
Ausgabe:
List((c,10), (a,40), (b,60))
Auf die gleiche Weise können wir auch nach ihrem ersten Element sortieren.
Beispielcode:
val list = List(('b',60),('c',10),('a',40))
println(list.sortBy(_._1))
Ausgabe:
List((a,40), (b,60), (c,10))
Verwendung der Methode sortWith
zum Sortieren eines Arrays in Scala
Die sortWith(function)
ist sehr nützlich, wenn wir die Sortierung vergessen und Elemente basierend auf der angegebenen Vergleichsfunktion sortieren möchten. Wir können also jede benutzerdefinierte Vergleichsfunktion übergeben.
Methodendefinition:
def sortWith(lt: (X, X) => Boolean): Repr
Beispielcode 1:
Hier haben wir die Mitarbeiter vom höchsten zum niedrigsten Gehalt sortiert.
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))
Ausgabe:
List(employee(3,stark,15000.0), employee(1,tony,12000.0), employee(2,bruce,11000.0), employee(4,naruto,200.0))
Beispielcode 2:
Hier übergeben wir unsere benutzerdefinierte Funktion in der Methode 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)))
Ausgabe:
List(employee(4,naruto,200.0), employee(2,bruce,11000.0), employee(1,tony,12000.0), employee(3,stark,15000.0))
Wir haben die Daten aufsteigend nach dem salary
im obigen Code sortiert.