java компаратор сортировка с массивом модели и другим полем

Вопрос или проблема

У меня есть класс java..
public class response_messages {

                private String message;
                private String rejectCode;
                private int ruleSeqNo;
                private String contInd;

                public String getMessage() {
                                    return message;
                }

                public void setMessage(String message) {
                                    this.message = message;
                }

                public String getRejectCode() {
                                    return rejectCode;
                }

                public void setRejectCode(String rejectCode) {
                                    this.rejectCode = rejectCode;
                }

                public int getRuleSeqNo() {
                                    return ruleSeqNo;
                }

                public void setRuleSeqNo(int ruleSeqNo) {
                                    this.ruleSeqNo = ruleSeqNo;
                }

                public String getContInd() {
                                    return contInd;
                }

                public void setContInd(String contInd) {
                                    this.contInd = contInd;
                }

}

Затем массив объектов этого класса, а также массив строк

                private List<response_messages> responseMessage = new ArrayList<response_messages>();

                private String[] reqRejects;
                
                public String[] getReqRejects() {
                                    return this.reqRejects;
                }
                
                public void setReqRejects(String[] reqRejects) {
                                    this.reqRejects = reqRejects;
                }

Мое требование – отсортировать этот массив объектов responseMessage по массиву строк model reqRejects, а затем по ruleSeqNo (по возрастанию)

Например.
Входной массив объектов
|Сообщение |Код отказа |Номер правила |Контрольный Индекс|
| ——– | ————– |————– |————– |
|abcd |60 |101 |Y|
|cdef |40 |300|Y|
|xyz |41 |280|Y|
|133 |41 |270|Y|
|56f |40 |275|Y|
|677 |60 |102|Y|
|hfdd |A5 |400|Y|

Модельный массив строк

Отказ
A5
40
60
41

Отсортированный выходной массив объектов должен быть
|Сообщение |Код отказа |Номер правила |Контрольный Индекс|
| ——– | ————– |————– |————– |
|hfdd |A5 |400 |Y|
|56f |40 |275 |Y|
|cdef |40 |300|Y|
|abcd |60 |101 |Y|
|677 |60 |102 |Y|
|133 |41 |270 |Y|
|xyz |41 |280 |Y|

В настоящее время я использовал компаратор, как ниже, который сортирует только по номеру последовательности

responseMessage.sort(Comparator.comparingInt(m -> m.getRuleSeqNo()));

Думаю, как добавить сортировку на основе массива строк модели к этому.

Ответ или решение

Чтобы отсортировать массив объектов response_messages, используя как массив строк reqRejects, так и поле ruleSeqNo, необходимо создать пользовательский компаратор. Этот компаратор будет сначала использовать порядковый номер из массива reqRejects, а затем сортировать по ruleSeqNo. Далее представлю пошаговое решение вашей задачи.

Шаг 1: Определение объекта response_messages

Для начала у вас уже есть класс response_messages, который имеет необходимые поля и методы доступа (геттеры и сеттеры):

public class response_messages {
    private String message;
    private String rejectCode;
    private int ruleSeqNo;
    private String contInd;

    // Геттеры и сеттеры
}

Шаг 2: Создание компаратора

Следующий шаг — создание компаратора, который будет учитывать оба критерия сортировки. Мы можем использовать Comparator в Java для этого. Он будет сначала искать индекс кода отклонения (rejectCode) в массиве reqRejects, а потом сортировать по ruleSeqNo.

Вот пример реализации компаратора:

import java.util.*;

public class ResponseMessageSorter {

    private List<response_messages> responseMessages = new ArrayList<>();
    private String[] reqRejects;

    public ResponseMessageSorter(List<response_messages> responseMessages, String[] reqRejects) {
        this.responseMessages = responseMessages;
        this.reqRejects = reqRejects;
    }

    public void sortMessages() {
        Arrays.sort(this.reqRejects);

        Comparator<response_messages> comparator = new Comparator<response_messages>() {
            @Override
            public int compare(response_messages o1, response_messages o2) {
                // Найти индексы rejectCode в reqRejects
                int index1 = getRejectIndex(o1.getRejectCode());
                int index2 = getRejectIndex(o2.getRejectCode());

                // Сравнить индексы.rejectCode
                if (index1 != index2) {
                    return Integer.compare(index1, index2);
                }
                // Если rejectCode одинаковы, сортируем по ruleSeqNo
                return Integer.compare(o1.getRuleSeqNo(), o2.getRuleSeqNo());
            }

            private int getRejectIndex(String rejectCode) {
                for (int i = 0; i < reqRejects.length; i++) {
                    if (reqRejects[i].equals(rejectCode)) {
                        return i;
                    }
                }
                // Если rejectCode нет в reqRejects, возвращаем максимальное значение, чтобы поместить в конец
                return reqRejects.length;
            }
        };

        // Сортировка списка на основе компаратора
        responseMessages.sort(comparator);
    }

    // Пример вывода отсортированного списка
    public void printSortedMessages() {
        for (response_messages message : responseMessages) {
            System.out.println(message.getMessage() + " | " + message.getRejectCode() + " | " +
                               message.getRuleSeqNo() + " | " + message.getContInd());
        }
    }
}

Шаг 3: Использование класса

Теперь, чтобы использовать данный класс для сортировки сообщений, вы можете создать экземпляр ResponseMessageSorter, передать список сообщений и массив кодов отклонения, а затем вызвать метод сортировки и вывод.

public static void main(String[] args) {
    List<response_messages> messages = new ArrayList<>();
    // Здесь добавляется инициализация вашего списка сообщений

    String[] reqRejects = {"A5", "40", "60", "41"};

    ResponseMessageSorter sorter = new ResponseMessageSorter(messages, reqRejects);
    sorter.sortMessages();
    sorter.printSortedMessages();
}

Результат работы

После выполнения программы, список response_messages будет отсортирован в соответствии с указанными правилами: сначала по индексу rejectCode из массива reqRejects, а затем по полю ruleSeqNo в порядке возрастания.

Таким образом, мы эффективно осуществляем сортировку массива объектов с учетом нескольких критериев, что позволяет добиться нужного результата в соответствии с требованиями.

Оцените материал
Добавить комментарий

Капча загружается...