Embora classificar objetos em uma lista com base em um campo seja simples, classificar usando vários campos pode ser um pouco complicado . Este artigo investiga a questão da classificação por vários campos e explora as diversas soluções disponíveis em Java.
Considere um cenário onde você tem uma lista de objetos "Relatório" com três campos : ReportKey, StudentNumber e Escola. Você deseja classificar esta lista usando todos os três campos em uma ordem específica.
O snippet de código fornecido tenta classificar a lista usando Collections.sort com um comparador personalizado, mas por algum motivo, a classificação não está funcionando como esperado. Você suspeita que pode haver um problema com o código.
Seu código realmente tem um problema. Vamos analisar o problema e identificar a solução correta.
O problema no código fornecido está na concatenação dos três campos:
return (record1.getReportKey() record1.getStudentNumber() record1.getSchool()).compareTo(record2.getReportKey() record2.getStudentNumber() record2.getSchool());
Esta concatenação assume que os campos são de digite String. No entanto, no seu caso, todos os três campos são definidos como tipos String, portanto a concatenação resultaria simplesmente em uma comparação de strings. Provavelmente não é isso que você pretendia.
Para comparar corretamente os campos, você precisa compará-los individualmente e na ordem correta:
return Comparator.comparing(Report::getReportKey)
.thenComparing(Report::getStudentNumber)
.thenComparing(Report::getSchool)
.compare(record1, record2);
Além do código corrigido, aqui estão soluções alternativas para classificação por vários campos em Java:
Opção 1: Classificação reflexiva usando BeanComparator
BeanComparator pode ser usado para classificar objetos com base em getters. No entanto, é propenso a erros e menos eficiente devido ao uso de reflexão.
Opção 2: Google Guava ComparisonChain
O Google Guava fornece uma maneira conveniente de encadear múltiplas comparações. Ele também lida com valores nulos normalmente.
Opção 3: Apache Commons CompareToBuilder
Esta classe de biblioteca é semelhante ao ComparisonChain do Guava, mas tem um comportamento padrão ligeiramente diferente para valores nulos.
A solução correta para o seu problema é usar o código revisado com comparações de campos individuais. Alternativamente, você pode escolher uma das outras opções discutidas acima com base em seus requisitos específicos. Compreender os princípios de classificação por vários campos e as diferenças entre as ferramentas disponíveis permitirá que você lide com eficácia com cenários de classificação complexos em seus aplicativos Java.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3