Scala で配列をソートする

Suraj P 2023年1月30日
  1. Scala で sorted メソッドを使用して配列をソートする
  2. Scala で sortBy(attribute) メソッドを使用して配列をソートする
  3. Scala で sortWith メソッドを使用して配列をソートする
Scala で配列をソートする

この記事では、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))

上記のコードでは、ケースクラス studentname 属性に基づいてオブジェクトを並べ替えています。

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

上記のコードの給与に基づいて、データを昇順で並べ替えました。

著者: 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

関連記事 - Scala Array