«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как отсортировать список объектов в Java, используя несколько полей?

Как отсортировать список объектов в Java, используя несколько полей?

Опубликовано 7 ноября 2024 г.
Просматривать:157

 How to Sort a List of Objects in Java Using Multiple Fields?

Пользовательская сортировка объектов списка с несколькими полями в Java

Хотя сортировка объектов в списке на основе одного поля проста, сортировка с использованием нескольких полей может быть немного сложной . В этой статье рассматривается проблема сортировки по нескольким полям и рассматриваются различные решения, доступные в 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