递归到迭代 - 重构 [英] Recursion to Iteration- refactoring
本文介绍了递归到迭代 - 重构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我写了这段代码,但现在我想重构它以便不使用递归。但我无法绕过它?任何想法家伙?
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屋!
查看全文