2016-03-07 3 views
0

Я написал этот код, но теперь хочу реорганизовать его, чтобы не использовать рекурсию. Но я не могу обвести вокруг себя голову? Любые идеи парней?Рекурсия в Iteration-refactoring

public List<ServiceDTO> findCustomerServices(String customerId) { 
    List<Service> serviceTree = contractService.findCustomerServices(customerId); 
    List<ServiceDTO> serviceDTOs = new ArrayList<ServiceDTO>(); 
    cloneTree(serviceTree, serviceDTOs); 
    return serviceDTOs; 
} 

private void cloneTree(List<Service> services, List<ServiceDTO> clonedServices) { 
    for (Service service : services) { 
    ServiceDTO serviceDTO = new ServiceDTO(); 
    serviceDTO.setServiceId(service.getServiceId()); 
    serviceDTO.setCfServiceInstanceId(service.getCfServiceInstanceId()); 
    serviceDTO.setEndDate(service.getEndDate()); 
    serviceDTO.setStartDate(service.getStartDate()); 
    serviceDTO.setPhoneNumber(service.getPhoneNumber()); 
    serviceDTO.setIsPrimary(service.getIsPrimary()); 
    serviceDTO.setDesignationNumber(service.getDesignationNumber()); 
    serviceDTO.setServiceIdentifier(service.getServiceIdentifier()); 
    serviceDTO.setEndDateDay(service.getEndDateDay()); 
    serviceDTO.setEndDateMonth(service.getEndDateMonth()); 
    serviceDTO.setEndDateYear(service.getEndDateYear()); 
    clonedServices.add(serviceDTO); 
    if (service.getDependentServices() != null && !service.getDependentServices().isEmpty()) { 
     cloneTree(service.getDependentServices(), serviceDTO.getDependentServices()); 
    } 
    } 
} 
+0

Почему вы хотите, чтобы реорганизовать его? – shmosel

+0

Потому что он использует слишком mcuh память. У каждой службы может быть множество зависимых сервисов, несколько уровней вниз. – Dariusz

+0

Есть ли предел глубине? – shmosel

ответ

0

Вот один из способов имитации рекурсии, используя структуру стеки:

private List<ServiceDTO> cloneTree(List<Service> services) { 
    List<ServiceDTO> result = new ArrayList<>(); 

    Stack<Iterator<Service>> stack = new Stack<>(); 
    // push the base iterator onto the stack 
    stack.push(services.iterator()); 

    while (!stack.isEmpty()) { 
     // get the current iterator 
     Iterator<Service> iter = stack.peek(); 

     // if iterator is done, pop back a level 
     if (!iter.hasNext()) { 
      stack.pop(); 
      continue; 
     } 

     // move to the next service 
     Service service = iter.next(); 

     // clone service 
     ServiceDTO serviceDTO = new ServiceDTO(); 
     serviceDTO.setServiceId(service.getServiceId()); 
     // ... 
     result.add(serviceDTO); 

     // if service has dependencies, push its iterator onto the stack 
     if (service.getDependentServices() != null && !service.getDependentServices().isEmpty()) { 
      stack.push(service.getDependentServices().iterator()); 
     } 
    } 

    return result; 
}