Хотя сортировка объектов в списке на основе одного поля проста, сортировка с использованием нескольких полей может быть немного сложной . В этой статье рассматривается проблема сортировки по нескольким полям и рассматриваются различные решения, доступные в Java.
Рассмотрим сценарий, в котором у вас есть список объектов «Отчет» с тремя полями. : ReportKey, StudentNumber и School. Вы хотите отсортировать этот список, используя все три поля в определенном порядке.
Предоставленный вами фрагмент кода пытается отсортировать список с помощью Collections.sort с пользовательским компаратором, но по какой-то причине сортировка не работает. как и ожидалось. Вы подозреваете, что с кодом может быть проблема.
В вашем коде действительно есть проблема. Давайте проанализируем проблему и найдем правильное решение.
Проблема в предоставленном коде заключается в объединении трех полей:
return (record1.getReportKey() record1.getStudentNumber() record1.getSchool()).compareTo(record2.getReportKey() record2.getStudentNumber() record2.getSchool());
Эта конкатенация предполагает, что поля имеют введите Строка. Однако в вашем случае все три поля определены как строковые типы, поэтому конкатенация просто приведет к сравнению строк. Скорее всего, это не то, что вы предполагали.
Чтобы правильно сравнить поля, вам необходимо сравнивать их по отдельности и в правильном порядке:
return Comparator.comparing(Report::getReportKey)
.thenComparing(Report::getStudentNumber)
.thenComparing(Report::getSchool)
.compare(record1, record2);
Помимо исправленного кода, вот альтернативные решения для сортировки по нескольким полям в Java:
Вариант 1. Рефлексивная сортировка с использованием BeanComparator
BeanComparator можно использовать для сортировки объектов на основе геттеров. Однако он подвержен ошибкам и менее эффективен из-за использования отражения.
Вариант 2: Google Guava ComparisonChain
Google Guava предоставляет удобный способ объединения нескольких сравнений в цепочку. Он также корректно обрабатывает нулевые значения.
Вариант 3: Apache Commons CompareToBuilder
Этот класс библиотеки похож на ComparisonChain из Guava, но имеет немного другое поведение по умолчанию для нулевых значений.
Правильное решение вашей проблемы — использовать пересмотренный код с индивидуальным сравнением полей. Кроме того, вы можете выбрать один из других вариантов, описанных выше, в зависимости от ваших конкретных требований. Понимание принципов сортировки по нескольким полям и различий между доступными инструментами позволит вам эффективно обрабатывать сложные сценарии сортировки в ваших Java-приложениях.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3