스칼라에서 배열 정렬

Suraj P 2023년1월30일
  1. Scala에서 sorted 메소드를 사용하여 배열 정렬
  2. sortBy(attribute) 메소드를 사용하여 스칼라에서 배열 정렬
  3. sortWith 메소드를 사용하여 Scala에서 배열 정렬
스칼라에서 배열 정렬

이 기사에서는 Scala 프로그래밍 언어에서 데이터 배열을 정렬하는 방법을 배웁니다.

정렬이란 어떤 조건에 따라 데이터를 오름차순 또는 내림차순으로 정렬하는 것을 말합니다. 정렬된 데이터 세트에서만 작동하는 이진 검색 알고리즘을 적용할 수 있으므로 대규모 데이터 세트에서 무언가를 검색하려는 경우 매우 일반적으로 사용되는 방법입니다.

스칼라 정렬 방법은 내부적으로 병합 정렬과 삽입 정렬 알고리즘의 하이브리드인 TimSort를 사용합니다. 이제 Scala에 있는 세 가지 정렬 방법을 살펴보겠습니다.

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 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 속성을 기반으로 개체를 정렬했습니다.

sortBy(attribute) 메소드를 사용하여 스칼라에서 배열 정렬

Scala의 sortBy 메소드는 하나 이상의 클래스 속성을 기반으로 정렬할 수 있습니다. 범위에 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 속성을 기반으로 정렬된 데이터를 인쇄하고 두 번째 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 속성을 기준으로 데이터를 정렬했습니다.

이 방법은 여러 속성을 기반으로 데이터를 정렬하는 데에도 유용합니다. 첫 번째 속성을 기반으로 데이터를 정렬하여 작동합니다. 첫 번째 속성의 값이 같으면 두 번째 속성을 기준으로 정렬됩니다.

예제 코드:

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

이 방법을 사용하여 첫 번째 또는 두 번째 요소를 기반으로 튜플 목록을 정렬할 수도 있습니다. 다음은 두 번째 요소를 기준으로 튜플을 정렬하는 예입니다.

예제 코드:

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

sortWith 메소드를 사용하여 Scala에서 배열 정렬

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

위 코드의 salary를 기준으로 오름차순으로 데이터를 정렬했습니다.

작가: 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