Kotlin에서 여러 필드를 사용하여 컬렉션 정렬

David Mbochi Njonge 2023년6월20일
  1. Kotlin 프로젝트 생성
  2. 개별 속성을 사용하여 컬렉션 정렬
  3. 여러 속성을 사용하여 컬렉션 정렬
  4. 결론
Kotlin에서 여러 필드를 사용하여 컬렉션 정렬

Kotlin 라이브러리는 개발자가 요구 사항에 따라 활용할 수 있는 다양한 방법을 제공합니다. 이 자습서에서는 개별 필드와 여러 필드를 사용하여 컬렉션을 정렬하는 방법을 알려줍니다.

Kotlin 프로젝트 생성

IntelliJ 개발 환경을 열고 파일 > 새로 만들기 > 프로젝트를 선택합니다. 프로젝트 이름을 kotlin-sortby로 입력하고 언어 섹션에서 Kotlin을 선택한 다음 빌드 시스템 섹션에서 Intellij를 선택합니다.

마지막으로 만들기 버튼을 눌러 프로젝트를 생성합니다. src/main/kotlin 폴더 아래 Main.kt라는 파일을 만들고 다음 코드를 복사하여 파일에 붙여넣습니다.

암호:

import java.time.Year

data class Book(val id: Int,
                val name: String,
                val yearPublished: Year)

fun fetchBooks(): ArrayList<Book>{
    return arrayListOf(
        Book(1,"Java Arrays", Year.of(1984)),
        Book(2,"Python Arrays",Year.of(2021)),
        Book(3,"Pascal for loop",Year.of(2022)),
        Book(4,"Pascal Arrays",Year.of(2021)),
        Book(5,"Java for loop",Year.of(2022))
    )
}

이 코드에서는 Book 데이터 클래스를 사용하여 생성된 책 개체의 List를 반환하는 fetchBooks()라는 메서드를 생성했습니다. 예제에서 이 목록을 사용하여 다양한 기준에 따라 책을 정렬하는 방법을 확인합니다.

개별 속성을 사용하여 컬렉션 정렬

fetchBooks() 메서드 뒤에 Main.kt 파일에 다음 예제 코드를 복사하여 붙여넣습니다.

sortBy() 메서드를 사용하여 컬렉션 정렬

다음 예제에서는 sortBy() 메서드를 사용하여 yearPublished 필드를 사용하여 이전에 만든 목록을 정렬하는 usingSortBy()라는 메서드를 만듭니다.

sortBy() 메서드는 MutableList의 확장 함수이며 어떤 값도 반환하지 않습니다. 함수에는 적용되는 선택기 함수 앞에 crossinline 키워드가 있습니다. 즉, 선택기 함수는 로컬이 아닌 반환을 허용하지 않습니다.

선택기 기능은 뒤에서 Comparable 인터페이스를 사용하여 목록의 요소를 정렬합니다.

암호:

fun usingSortBy(){
    val books = fetchBooks()
    books.sortBy(Book::yearPublished)
    books.forEach(::println);
}

fun main(){
    usingSortBy();
}

출력:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=2, name=Python Arrays, yearPublished=2021)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=5, name=Java for loop, yearPublished=2022)

sortedBy() 메서드를 사용하여 컬렉션 정렬

컬렉션 프레임워크는 이 예제에서 얻을 수 없는 새 목록을 반환할 수 있는 sortBy() 메서드에 대한 대안을 제공합니다. Iterable 인터페이스의 확장 기능인 sortedBy() 메서드를 사용할 수 있습니다.

암호:

fun usingSortedBy(){
    fetchBooks().sortedBy(Book::yearPublished)
        .forEach(::println);
}

fun main(){
    usingSortedBy();
}

출력:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=2, name=Python Arrays, yearPublished=2021)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=5, name=Java for loop, yearPublished=2022)

sortedBy() 메서드는 선택기 함수를 사용하여 정렬된 요소가 포함된 목록을 반환하고 반환된 목록에서 forEach() 메서드를 호출하여 객체를 콘솔에 기록할 수 있습니다.

여러 속성을 사용하여 컬렉션 정렬

이전 예제에서 단일 필드를 사용하여 요소를 정렬하는 방법을 살펴보았습니다. 그러나 클라이언트가 애플리케이션의 여러 필드를 기반으로 정렬하려는 경우가 있습니다.

이 섹션에서는 이 기능을 구현하는 방법을 알아봅니다.

sortWith() 메서드를 사용하여 컬렉션 정렬

이 예제에서는 sortWith() 메서드를 사용하여 책의 이름과 책의 연도를 사용하여 목록을 정렬하는 usingSortWith()라는 메서드를 만들었습니다.

sortWith() 메서드는 MutableList의 확장 함수이며 Comparator를 반환하는 모든 인수를 허용합니다. 이 메서드는 값을 반환하지 않습니다.

암호:

fun usingSortWith(){
    val books = fetchBooks();
    books.sortWith(compareBy(Book::name, Book::yearPublished));
    books.forEach(::println);
}

fun main(){
    usingSortWith();
}

compareBy() 메소드를 sortWith() 메소드의 인수로 사용했습니다. compareBy() 메서드는 Comparator를 반환하고 서로 다른 속성을 기반으로 목록을 정렬하기 위해 둘 이상의 선택기 함수로 오버로드될 수 있습니다.

선택기 함수 정의 앞에 추가된 vararg 키워드는 둘 이상의 인수를 전달할 수 있음을 나타냅니다.

출력:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=5, name=Java for loop, yearPublished=2022)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=2, name=Python Arrays, yearPublished=2021)

sortedWith() 메서드를 사용하여 컬렉션 정렬

컬렉션 프레임워크는 정렬된 요소를 포함하는 새 목록을 반환할 수 있는 sortWith() 메서드에 대한 대안을 제공합니다. 이 기능을 구현하기 위해 sortedWith() 메서드를 사용할 수 있습니다.

sortedWith() 메서드는 Iterable 인터페이스의 확장 함수이며 Comparator를 반환하는 모든 인수를 허용합니다.

암호:

fun usingSortedWith(){
    fetchBooks().sortedWith(compareBy(Book::name, Book::yearPublished))
        .forEach(::println);
}

fun main(){
    usingSortedWith();
}

이전 예제에서와 같이 Comparator를 반환하는 compareBy()를 사용하고 이름과 연도를 사용하여 목록을 정렬하기 위해 오버로드했습니다.

출력:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=5, name=Java for loop, yearPublished=2022)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=2, name=Python Arrays, yearPublished=2021)

결론

이 자습서에서는 원하는 기준에 따라 목록을 정렬하는 데 사용할 수 있는 다양한 방법을 배웠습니다. 우리가 다룬 접근 방식에는 sortBy() 메서드 사용, sortedBy() 메서드 사용, sortWith() 메서드 사용 및 sortedWith() 메서드 사용이 포함됩니다.

다른 두 가지 정렬 전략을 사용하면 목록을 내림차순으로 정렬할 수 있으며 여기에는 sortByDescending()sortedByDescending()이 포함됩니다.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub