问题
I wrote this code but now I want to refactor it in order not to use recursion. But I can't wrap my head around it? Any ideas guys?
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());
}
}
}
回答1:
Here's one way to simulate recursion using a stack structure:
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;
}
来源:https://stackoverflow.com/questions/35839109/recursion-to-iteration-refactoring