Kotlin의 정렬 가이드

1. 개요

Kotlin은 확장 메소드를 사용하여 자바 컬렉션 프레임 워크 위에 빌드됩니다. 이를 통해 Apache Commons 또는 Guava와 같은 타사 종속성 없이도 유용성과 가독성이 크게 향상됩니다.

이 튜토리얼에서는 Kotlin에서의 정렬에 초점을 맞출 것입니다. 또한 복잡한 순서 규칙을 구현 하기 위해 kotlin.comparisons 패키지를 사용할 것 입니다.

2. 컬렉션 정렬

Kotlin은 컬렉션을보다 쉽게 ​​정렬 할 수 있도록 여러 유틸리티를 제공합니다. 이러한 방법 중 몇 가지를 살펴 보겠습니다.

2.1. 종류

컬렉션을 정렬하는 가장 간단한 방법은 sort 메서드 를 호출하는 입니다. 이 방법은 요소의 자연스러운 순서를 사용합니다. 또한 기본적으로 오름차순으로 정렬되므로 'a'는 'b'앞에 있고 '1'은 '2'앞에 있습니다.

val sortedValues = mutableListOf(1, 2, 7, 6, 5, 6) sortedValues.sort() println(sortedValues)

그리고 위 코드의 결과는 다음과 같습니다.

[1, 2, 5, 6, 6, 7]

변경 가능한 컬렉션을 사용했다는 점에 유의하는 것이 중요합니다. 그 이유는 것입니다 정렬 방법에서 현재 위치에 정렬합니다 . 결과를 새 목록으로 반환하려면 대신 정렬 된 메서드 를 사용해야합니다 .

또한 내림차순 정렬을 위해 sortDescending 또는 reverse 메소드를 사용할 수 있습니다 .

2.2. 정렬 기준

주어진 객체의 특정 속성을 기준으로 정렬해야하는 경우 sortBy 를 사용할 수 있습니다 . sortBy의 방법은 우리가 인수로 선택 기능을 전달할 수 있습니다. 선택기 함수는 객체를 수신하고 정렬하려는 값을 반환해야합니다.

val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e") sortedValues.sortBy { it.second } println(sortedValues)

그리고 위 코드의 결과는 다음과 같습니다.

[(1, a), (2, b), (7, c), (5, c), (6, d), (6, e)]

다시 말하지만, sortBy 메소드가 제자리에서 정렬 되기 때문에 컬렉션은 변경 가능해야합니다 . 결과를 새 목록으로 반환 하려면 sortBy 메서드 대신 sortedBy 메서드 를 사용해야합니다 .

이전과 마찬가지로 내림차순의 경우 sortByDescending 또는 reverse 메소드를 사용할 수 있습니다 .

2.3. SortWith

고급 사용법 (예 : 여러 규칙 결합)을 위해 sortWith 메소드를 사용할 수 있습니다 .

Comparator 객체를 인수로 전달할 수 있습니다 . Kotlin에는 Comparator 객체 를 만드는 여러 가지 방법이 있으며 다음 섹션에서 다룰 것입니다.

val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e") sortedValues.sortWith(compareBy({it.second}, {it.first})) println(sortedValues)

그리고 위 코드의 결과는 문자와 숫자로 정렬됩니다.

[(1, a), (2, b), (5, c), (7, c), (6, d), (6, e)]

sortWith 는 제자리에서 정렬을 수행 하기 때문에 변경 가능한 컬렉션을 사용해야합니다. 우리는 새로운 컬렉션으로 반환 된 결과를 원한다면 우리는 사용할 필요가 sortedWith의 의 대신 방법을 sortWith의 방법 .

내림차순의 경우 반대 방법을 사용하거나 올바른 Comparator를 정의 할 수 있습니다 .

3. 비교

코 틀린는 구축 할 수있는 매우 유용한 패키지 포함 비교기 - kotlin.comparisons합니다. 다음 섹션에서 논의 할 것입니다.

  • 비교기 생성
  • null 값 처리
  • 주문 취소
  • 비교기 규칙 확장

3.1. 비교기 생성

Comparator 생성을 단순화하기 위해 Kotlin은 코드를보다 표현력있게 만들기 위해 많은 팩토리 메서드를 제공합니다.

사용 가능한 가장 간단한 비교기 팩토리는 naturalOrder () 입니다. 인수가 필요하지 않으며 순서는 기본적으로 오름차순입니다.

val ascComparator = naturalOrder()

속성이 여러 개인 객체의 경우 compareBy 메서드를 사용할 수 있습니다 . 인수로 우리는 각각 Comparable 객체를 반환하는 다양한 수의 함수 (정렬 규칙)를 제공 합니다. 그런 다음 결과 Comparable 개체가 같지 않은 것으로 평가되거나 모든 함수가 호출 될 때까지 이러한 함수가 순차적으로 호출됩니다.

다음 예에서, 그것 . 첫 번째 값은 비교에 사용되며 값이 같을 때만 it. second 가 호출되어 동점을 끊습니다.

val complexComparator = compareBy
    
     ({it.first}, {it.second})
    

탐구 자유롭게 kotlin.comparisons 가능한 모든 공장을 발견 할 수 있습니다.

3.2. null 값 처리

우리 개선하는 간단한 방법 비교기 값 처리는 사용하는 것입니다 nullsFirst 또는 nullsLast 방법. 이 메서드는 각각 첫 번째 또는 마지막 위치에서 null 값을 정렬 합니다.

val sortedValues = mutableListOf(1 to "a", 2 to null, 7 to "c", 6 to "d", 5 to "c", 6 to "e") sortedValues.sortWith(nullsLast(compareBy { it.second })) println(sortedValues)

위 코드의 결과는 다음과 같습니다.

[(1, a), (7, c), (5, c), (6, d), (6, e), (2, null)]

결과 컬렉션의 마지막 값이 null임을 알 수 있습니다.

3.3. 주문 취소

To reverse the order, we can use the reverseOrder method or the reversed method. The former method has no arguments and returns a descending order. The latter method can be applied on a Comparator object and it will return its reversed Comparator object.

To build a Comparator using descending natural order we can do:

reverseOrder()

3.4. Comparator Rules Extension

Comparator objects can be combined or extended with additional sorting rules via the then methods available in kotlin.comparable package.

Only when the first comparator evaluates to equal, the second comparator will then be used.

학생 목록에는 각 개인의 나이와 이름이 포함되어 있습니다. 가장 어린 것부터 가장 오래된 것 순으로 정렬하고 같은 나이 일 때는 이름을 기준으로 내림차순으로 정렬합니다.

val students = mutableListOf(21 to "Helen", 21 to "Tom", 20 to "Jim") val ageComparator = compareBy
    
      {it.first} val ageAndNameComparator = ageComparator.thenByDescending {it.second} println(students.sortedWith(ageAndNameComparator))
    

위 코드의 결과는 다음과 같습니다.

[(20, Jim), (21, Tom), (21, Helen)]

4. 결론

이 빠른 자습서에서는 Kotlin에서 컬렉션을 정렬하기 위해 sort , sortBysortWith 메서드 를 사용하는 방법을 살펴 보았습니다 .

나중에 kotlin.comparisons 패키지를 사용하여 Comparator 개체 를 만들고 추가 정렬 규칙을 사용하여 향상 시켰습니다.

이러한 모든 예제 및 스 니펫의 구현은 GitHub에서 찾을 수 있습니다.