1
resposta

Ordenação considerando acentuações (pt-br)

No exemplo, a ordenação por autores ficou errada quando havia acentuação ("José de Alencar" ficou antes de "João Guimarães Rosa") .

Para acertar isso, pesquisei opções e cheguei no código abaixo, usando o Collator e sortedWith:

    val ordenadoPorAutorPtBr = livros.sortedWith(Comparator { livro, outroLivro ->
        Collator
            .getInstance(Locale("pt", "BR"))
            .compare(livro.autor, outroLivro.autor)
    }).toMutableList()
    ordenadoPorAutorPtBr.imprimeComMarcadores()

Ainda não conheço outras alternativas. No caso de nomes que podem ter várias nacionalidades e acentos, talvez haja uma solução melhor.

1 resposta

Olá, Adriana

O código que você encontrou utilizando o Collator e sortedWith é uma ótima opção para resolver esse problema.

No entanto, se você está lidando com nomes que podem ter várias nacionalidades e acentos, talvez seja interessante considerar o uso da biblioteca ICU4J. Essa biblioteca oferece suporte para ordenação de strings com base em regras específicas de idiomas, incluindo acentuações.

Para utilizar a biblioteca ICU4J, você precisará adicioná-la como dependência no seu projeto. Em seguida, você pode utilizar a classe RuleBasedCollator para criar um objeto Collator personalizado com as regras de ordenação desejadas. Por exemplo:

import com.ibm.icu.text.Collator
import com.ibm.icu.text.RuleBasedCollator
import java.text.ParseException

fun main() {
    try {
        val rules = "< a < á < b < c < d < e < é < f < g < h < i < í < j < k < l < m < n < o < ó < p < q < r < s < t < u < ú < v < w < x < y < z"
        val collator = RuleBasedCollator(rules)

        val nomes = listOf("José", "João", "Álvaro", "Érica")
        val nomesOrdenados = nomes.sortedWith(collator)

        nomesOrdenados.forEach { println(it) }
    } catch (e: ParseException) {
        e.printStackTrace()
    }
}

Nesse exemplo, estamos criando um Collator personalizado com as regras de ordenação em português, considerando as acentuações. Em seguida, utilizamos o método sortedWith para ordenar a lista de nomes de acordo com o Collator criado.

Espero ter ajudado e bons estudos!