У меня проблема с получением двух списков объектов и их эффективным объединением, чтобы по существу создать третью модель данных, которая возвращается в конечной точке моего API. Одна из проблем заключается в том, что я получаю список сущностей [Сотрудники] из одной базы данных, а затем я получаю другой список сущностей [ClockedIn] из другой базы данных, так что это выглядит так:
class Employee {
private Integer employeeID;
private String firstName;
private String lastName;
etc...
//corresponding getters and setters
}
и
class ClockedIn {
private Integer employeeID;
private Date timeStamp;
etc...
//corresponding getters and setters
}
Для присоединения сейчас я делаю это следующим образом:
List<Employee> getEmployees = repository.getAll();
List<ClockedIn> getClockedIn = repository.getAll();
List<JoinedDataModel> joinedDataModelList = new ArrayList<JoinedDataModel>();
for(Employee emp : getEmployees) {
JoinedDataModel joinDataModel = new JoinedDataModel();
int currentId = empt.getEmployeeId();
List<Dates> missingClockedIn = new ArrayList<Dates>();
for(ClockedIn ci : getClockedIn) {
if(currentId == ci.getEmployeeId) {
// add together to the third datamodel
joinDataModel.setId();
if(missingDate(ci.getTimeStamp()) {
missingClockedIn.add(ci.getTimeStamp());
}
}
joinDataModel.setMissingClockedIn(missingClockedIn);
}
}
joinedDataModelList.add(joinDataModel);
У меня около 70 тыс. Элементов в ClockedIn-списке и 1400 в Employee-List, и для вычисления требуется около 15 секунд , но следует учитывать, что мне нужно получить данные из двух разных баз данных. Однако, если я добавлю 10k к списку ClockedIn, сервер истекает по тайм-ауту, я не настолько хорошо разбираюсь в нотации Big O, но я думаю, что способ, которым я его настроил сейчас, довольно тяжелый из-за вложенных циклов, я думаю, что это O (n2)?
Есть ли более эффективный подход, который я мог бы использовать? Я думаю, что одна вещь могла бы сделать его более плавным, если бы два списка были объединены перед выполнением сопоставления с третьей моделью данных, но я не уверен, как бы я мог сделать это более элегантным способом.
Любые входные данные на моя реализация выше будет принята с благодарностью!
Спасибо!
* Отказ от ответственности, все это псевдокод, поэтому любая синтаксическая ошибка или что-то подобное найдено в коде размещенные здесь не имеют отношения к моей проблеме.