스칼라에서 배열 정렬
-
Scala에서
sorted
메소드를 사용하여 배열 정렬 -
sortBy(attribute)
메소드를 사용하여 스칼라에서 배열 정렬 -
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
를 기준으로 오름차순으로 데이터를 정렬했습니다.