Scala で配列をソートする
-
Scala で
sorted
メソッドを使用して配列をソートする -
Scala で
sortBy(attribute)
メソッドを使用して配列をソートする -
Scala で
sortWith
メソッドを使用して配列をソートする
この記事では、Scala プログラミング言語でデータの配列をソートする方法を学びます。
並べ替えとは、条件に基づいてデータを昇順または降順で並べ替えることを指します。並べ替えられたデータセットでのみ機能するバイナリ検索アルゴリズムを適用できるため、大規模なデータセットで何かを検索する場合に非常に一般的に使用される方法です。
Scala のソート方法は、マージソートと挿入ソートアルゴリズムのハイブリッドである TimSort を内部的に使用します。それでは、Scala に存在する 3つのソート方法を見てみましょう。
Scala で sorted
メソッドを使用して配列をソートする
sorted
メソッドは、List、Array、Vector、Seq などの Scala のシーケンスを並べ替えるために使用されます。このメソッドは、自然な順序でソートされた新しいコレクションを返します。
メソッド定義:
def sorted[Y >:X] (implicit ord:Ordering[Y]): Repr
ここで、X
は、コレクションで使用する要素のタイプを指します。Repr
は、要素を持つ実際のコレクションのタイプです。
例を見てみましょう:
object MyClass {
def main(args: Array[String]) {
val seq = Seq(12,3,78,90,1)
println(seq.sorted)
}
}
出力:
List(1, 3, 12, 78, 90)
デフォルトでは、並べ替えは昇順で行われます。データを降順で並べ替える場合は、次の構文を使用できます。
sorted(Ordering.DataType.reverse)
コード例:
object MyClass {
def main(args: Array[String]) {
val seq = Seq(12,3,78,90,1)
println(seq.sorted(Ordering.Int.reverse))
}
}
出力:
List(90, 78, 12, 3, 1)
sorted
メソッドを使用して、ケースクラスの属性に基づいてデータを並べ替える場合は、Ordered
トレイトを拡張してから、抽象メソッド compare
をオーバーライドする必要があります。compare
メソッド内で、case クラスのオブジェクトを並べ替える属性を定義する必要があります。
これはカスタムデータ並べ替えと呼ばれます。つまり、データを並べ替える条件を指定します。
コード例:
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)
出力:
List(student(2,bruce), student(3,stark), student(1,tony))
上記のコードでは、ケースクラス student
の name
属性に基づいてオブジェクトを並べ替えています。
Scala で sortBy(attribute)
メソッドを使用して配列をソートする
Scala の sortBy
メソッドは、1つ以上のクラス属性に基づいてソートできます。このメソッドは、スコープに Ordering
フィールドタイプがある場合に使用できます。
ここでは、デフォルトの並べ替えも昇順です。
メソッド定義:
def sortBy[B](f: A => B)(implicit ord: Ordering[B]): Repr
コード例:
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))
出力:
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))
上記のコードでは、最初に属性 name
に基づいて並べ替えられたデータを出力し、2 番目の print ステートメントで属性 salary
に基づいてデータを並べ替えました。
メソッドを少し調整することで、データを降順で並べ替えることができます。
sortBy(_.attribute)(Ordering[data_type_of_attribute].reverse)
コード例:
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))
出力:
List(employee(1,tony,12000.0), employee(3,stark,15000.0), employee(2,bruce,11000.0))
上記のコードの name
属性に基づいてデータを並べ替えました。
この方法は、複数の属性に基づいてデータを並べ替える場合にも役立ちます。これは、最初の属性に基づいてデータを並べ替えることによって機能します。最初の属性の値が同じである場合、2 番目の属性に基づいて並べ替えられます。
コード例:
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))))
出力では、name
が同じである場合、データは salary
属性に基づいてソートされていることがわかります。
出力:
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))
この方法を使用すると、最初または 2 番目の要素に基づいてタプル
のリストを並べ替えることもできます。以下は、2 番目の要素に基づいてタプルをソートする例です。
コード例:
val list = List(('b',60),('c',10),('a',40))
println(list.sortBy(_._2))
出力:
List((c,10), (a,40), (b,60))
同様に、最初の要素に基づいて並べ替えることもできます。
コード例:
val list = List(('b',60),('c',10),('a',40))
println(list.sortBy(_._1))
出力:
List((a,40), (b,60), (c,10))
Scala で sortWith
メソッドを使用して配列をソートする
sortWith(function)
は、指定された比較関数に基づいて要素の順序付けと並べ替えを忘れたい場合に非常に便利です。したがって、任意のカスタム比較関数を渡すことができます。
メソッド定義:
def sortWith(lt: (X, X) => Boolean): Repr
コード例 1:
ここでは、従業員を給与の高いものから低いものの順に並べ替えています。
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))
出力:
List(employee(3,stark,15000.0), employee(1,tony,12000.0), employee(2,bruce,11000.0), employee(4,naruto,200.0))
コード例 2:
ここでは、カスタム関数を 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)))
出力:
List(employee(4,naruto,200.0), employee(2,bruce,11000.0), employee(1,tony,12000.0), employee(3,stark,15000.0))
上記のコードの給与
に基づいて、データを昇順で並べ替えました。