Сортировка ArrayList с использованием другого поля ArrayList для пользовательского объекта - PullRequest
0 голосов
/ 04 марта 2019

У меня есть 2 массива, RequestList и ResponseList пользовательского объекта.Список запросов содержит 10 запросов на мыло с RequestHeader и RequestBody.10 является примером (может быть даже 1000 или более или даже 1 миллион записей) Теперь RequestHeader (Header.java) имеет элемент с именем RequestId типа String

Объект запроса

<CustomClassRequest>
 <header>
    <RequestId>1</RequestId>
 </header>
 <Body></Body>
</CustomClassRequest>

Предположим, что RequestList имеет 10 запросов на мыло с requestId, начинающимся с 1 до 10 (используя числа для упрощения этого варианта использования)

Теперь я запускаю эти запросы на мыло параллельно и теряю инструкции на вставку, когда получаю свой ответ в видебыл в моем RequestList.Следовательно, мой ResponseList будет иметь ответ на все эти 10 запросов мыла, но в другом порядке идентификатора запроса.

Объект ответа

<CustomClassResponse>
 <header>
    <RequestId>1</RequestId>
 </header>
 <Body></Body>
</CustomClassResponse>

Примечание. Заголовок в ответе имеет другойКласс ResponseHeader.java

Можно ли выполнить сортировку моего ResponseList с помощью общего поля RequestId на основе порядка вставки, как существует RequestList.

Дайте мне знать, если у Java 8 API есть возможное решение или даже с помощьюлюбое стороннее решение

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Вы не должны использовать Comparator, так как вы не сравниваете элементы списка между ними, чтобы вычислить их порядок.
Вы можете создать карту из списка ответов, который связал идентификатор с ответом.
Затем выполните потоковую передачузапросить и сопоставить его идентификатор с ключом карты.
Вот решение, которое создает новый список для ответа:

Map<Integer, Response> responseByIdMap = responses.stream()
                                                  .collect(toMap(Response::getId, r->r);

responses = 
request.stream()
       .map( req -> responseByIdMap.get(req.getId))
       .collect(toList());
0 голосов
/ 04 марта 2019

Вы можете использовать java8 лямбда-выражение

например

resposneList.stream()
   .sorted((o1, o2) -> o1.getHeader().getRequestId()
   .compareTo(o2.getHeader().getRequestId()))`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...