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