Guia de Classificação em Kotlin

Guia de Classificação em Kotlin

1. Visão geral

O Kotlin se baseia na estrutura Java Collection usandoextension methods. Isso melhora drasticamente a usabilidade e a legibilidade sem a necessidade de dependências de terceiros, comoApache Commons ouGuava.

Neste tutorial, vamos nos concentrar na classificação em Kotlin. Além disso, usaremos o pacotekotlin.comparisons para implementar regras de ordenação complexas.

2. Classificando uma coleção

O Kotlin fornece vários utilitários para facilitar o processo de classificação de coleções. Vamos explorar vários desses métodos.

2.1. Sort

The simplest way to sort a collection is to call the sort method. Este método usará a ordem natural dos elementos. Além disso, a ordem será ascendente por padrão, então 'a' é antes de 'b' e '1' é antes de '2':

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

E o resultado do código acima é:

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

É importante observar que usamos uma coleção mutável. O motivo é quethe sort method will sort in-place. Se quisermos que o resultado seja retornado como uma nova lista, só precisamos usar o métodosorted.

Além disso, podemos usar os métodossortDescending oureverse para classificar em ordem decrescente.

2.2. SortBy

Se precisarmos classificar por propriedades específicas de um determinado objeto, podemos usarsortBy. The sortBy method allows us to pass a selector function as an argument. A função do seletor receberá o objeto e deve retornar o valor no qual gostaríamos de classificar:

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)

E o resultado do código acima é:

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

Novamente, a coleção precisa ser mutável porque o métodosortBy classificará no local. Se quisermos que o resultado seja retornado como uma nova lista, precisamos usar o métodosortedBy em vez do métodosortBy.

Como antes, para ordem decrescente, podemos usar os métodossortByDescending oureverse.

2.3. SortWith

Para um uso mais avançado (para combinar várias regras, por exemplo), podemos usar o métodosortWith.

Podemos passar um objetoComparator como um argumento. Em Kotlin, temos várias maneiras de criar objetosComparator e abordaremos isso na próxima seção:

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)

E o resultado do código acima é que eles são classificados por letra e depois por número:

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

ComosortWith fará a classificação no local, precisamos usar uma coleção mutável. Se quisermos que o resultado seja retornado como uma nova coleção, precisamos usar o métodosortedWith em vez do métodosortWith.

Para ordem decrescente, podemos usar o métodoreverse ou, alternativamente, definir oComparator certo.

3. Comparação

Kotlin contém um pacote muito útil para construir umComparator -kotlin.comparisons. Nas seguintes seções, discutiremos:

  • Comparator criação

  • Tratamento de valores denull

  • Estornando a ordem

  • Comparator extensão de regras

3.1. Criação deComparator

Para simplificar a criação de nossoComparator, o sKotlin traz diversos métodos de fábrica para tornar nosso código mais expressivo.

OComparator mais simples disponível de fábrica énaturalOrder(). Nenhum argumento é necessário e a ordem é crescente por padrão:

val ascComparator = naturalOrder()

Para objetos com múltiplas propriedades, podemos usar o métodocompareBy. Como argumentos, fornecemos um número variável de funções (regras de classificação), cada uma retornando um objetoComparable. Então, essas funções serão chamadas sequencialmente até que o objetoComparable resultante seja avaliado como diferente ou até que todas as funções sejam chamadas.

No próximo exemplo, o valorit.first é usado para comparações e, somente quando os valores são iguais,it.second será chamado para quebrar o empate:

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

Sinta-se à vontade para explorarkotlin.comparisons para descobrir todas as fábricas disponíveis.

3.2. Tratamento de valores denull

Uma maneira simples de melhorar nossoComparator com tratamento de valornull é usar os métodosnullsFirst ounullsLast. Esses métodos classificarão os valores denull no primeiro ou último lugar, respectivamente:

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)

O resultado do código acima será:

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

Podemos ver que o último valor na coleção resultante é aquele com valornull.

3.3. Estornando a ordem

Para inverter a ordem, podemos usar o métodoreverseOrder ou o métodoreversed. O método anterior não possui argumentos e retorna em ordem decrescente. O último método pode ser aplicado em um objetoComparator e retornará seu objetoComparator invertido.

Para construir umComparator usando ordem natural descendente, podemos fazer:

reverseOrder()

3.4. Extensão de Regras do Comparador

Os objetosComparator podem ser combinados ou estendidos com regras de classificação adicionais por meio dos métodosthen disponíveis no pacotekotlin.comparable.

Somente quando o primeiro comparador for avaliado como igual, o segundo comparador será usado.

Nossa lista de alunos contém uma idade e um nome para cada indivíduo. Queremos que eles sejam classificados do mais novo para o mais antigo e, quando têm a mesma idade, descem com base no nome:

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

O resultado do código acima será:

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

4. Conclusão

Neste tutorial rápido, vimos como usar os métodossort,sortByesortWith para classificar coleções no Kotlin.

Posteriormente, também usamos o pacotekotlin.comparisons para criar objetosComparator e aprimorá-los com regras de classificação adicionais.

A implementação de todos esses exemplos e fragmentos pode ser encontradaover on GitHub.