2016-03-07 128 views
0

我寫了這段代碼,但現在我想重構它以便不使用遞歸。但是我無法把頭圍住它?任何想法傢伙?遞歸到迭代 - 重構

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

因爲它使用太多內存。每項服務都可以有許多相關的服務,只有很少的關卡。 – 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; 
}