Recursion to Iteration- refactoring

若如初见. 提交于 2020-01-07 03:50:30

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!