递归到迭代 - 重构 [英] Recursion to Iteration- refactoring

查看:117
本文介绍了递归到迭代 - 重构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了这段代码,但现在我想重构它以便不使用递归。但我无法绕过它?任何想法家伙?

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());
    }
  }
}


推荐答案

以下是使用堆栈结构模拟递归的一种方法:

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;
}

这篇关于递归到迭代 - 重构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆