/**
* 一个递归算法,将一个PropertyDO(地域)的列表merge成一个PropertyDO
* @author hemaodong
* @param propertyDO1
* @param propertyDO2
* @return propertyDO1
*/
private static PropertyDO mergeArea(List<PropertyDO> propertyDOs) {
if (null != propertyDOs && propertyDOs.size() == 1) {
return propertyDOs.get(0);
}
int i = propertyDOs.size();
PropertyDO propertyDO1 = propertyDOs.get(i-2);
PropertyDO propertyDO2 = propertyDOs.get(i-1);
// 将propertyDO2转化成MAP,便于检索,如果propertyDO2中存在propertyDO1的值,
// 则将propertyDO2中的该值移除,若循环检索完后propertyDO2中还有值,则将
// propertyDO2中的值循环添加至propertyDO1中并返回,至此就完成了地域的merge
Map<Long, EnumDO> map = convert2Map(propertyDO2);
for (EnumDO enumDO : propertyDO1.getValuesAsList()) {
if (null != map.get(enumDO.getId())) {
map.remove(enumDO.getId());
}
}
if (map != null && map.size() != 0) {
for (Long key : map.keySet()) {
propertyDO1.getValuesAsList().add(map.get(key));
}
}
PropertyDO temp = propertyDO1;
propertyDOs.remove(propertyDO1);
propertyDOs.remove(propertyDO2);
propertyDOs.add(temp);
mergeArea(propertyDOs);
return propertyDOs.get(0);
}
/**
* @author hemaodong
* @param propertyDO2
* @return
*/
private static Map<Long, EnumDO> convert2Map(PropertyDO propertyDO) {
Map<Long, EnumDO> map = new HashMap<Long, EnumDO>();
for (EnumDO enumDO : propertyDO.getValuesAsList()) {
map.put(enumDO.getId(), enumDO);
}
return map;
}
@SuppressWarnings("serial")
public static void main(String args[]) {
final PropertyDO do1 = new PropertyDO();
List<EnumDO> enumDOlist1 = new ArrayList<EnumDO>(){
{
EnumDO enumDO1 = new EnumDO(1l, "1");
EnumDO enumDO2 = new EnumDO(2l, "2");
EnumDO enumDO3 = new EnumDO(3l, "3");
add(enumDO1);
add(enumDO2);
add(enumDO3);
}
};
do1.setValuesAsList(enumDOlist1);
final PropertyDO do2 = new PropertyDO();
List<EnumDO> enumDOlist2 = new ArrayList<EnumDO>(){
{
EnumDO enumDO3 = new EnumDO(3l, "3");
EnumDO enumDO4 = new EnumDO(4l, "4");
EnumDO enumDO5 = new EnumDO(5l, "5");
add(enumDO3);
add(enumDO4);
add(enumDO5);
}
};
do2.setValuesAsList(enumDOlist2);
final PropertyDO do3 = new PropertyDO();
List<EnumDO> enumDOlist3 = new ArrayList<EnumDO>(){
{
EnumDO enumDO3 = new EnumDO(3l, "3");
EnumDO enumDO4 = new EnumDO(4l, "4");
EnumDO enumDO5 = new EnumDO(5l, "5");
add(enumDO3);
add(enumDO4);
add(enumDO5);
}
};
do3.setValuesAsList(enumDOlist3);
final PropertyDO do4 = new PropertyDO();
List<EnumDO> enumDOlist4 = new ArrayList<EnumDO>(){
{
EnumDO enumDO3 = new EnumDO(7l, "7");
EnumDO enumDO4 = new EnumDO(8l, "8");
EnumDO enumDO5 = new EnumDO(9l, "9");
add(enumDO3);
add(enumDO4);
add(enumDO5);
}
};
do4.setValuesAsList(enumDOlist4);
List<PropertyDO> propertyDOs = new ArrayList<PropertyDO>(){
{
add(do1);
add(do2);
add(do3);
add(do4);
}
};
System.out.println(mergeArea(propertyDOs).getValuesAsList().size());
}
欢迎大家提供更好的算法
分享到:
相关推荐
递归算法通常包括两个部分:**基本情况**(base case)和**递归步骤**(recursive step)。 ##### 基本情况 基本情况是指能够直接得出答案的情况。对于递归算法而言,确定一个合适的终止条件至关重要,这是避免无限...
- **内存使用**:递归可能消耗更多内存,因为它需要存储每个递归调用的信息,而非递归只需要一个固定大小的数据结构来跟踪待处理的目录。 - **易读性**:递归算法往往更直观,代码结构更简洁,对于初学者来说更易于...
在ACM(国际大学生程序设计竞赛)中,递归算法是一种常见的解决问题的方法,它通过函数自身调用自身来实现问题的解决。递归的核心在于找到基本情况(base case),即可以直接求解的问题,以及每次递归调用时问题规模...
在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...
本文将深入探讨一个ABAP中的简单递归算法——计算阶乘,并通过SE38报表的形式进行展示。 #### 二、递归算法简介 递归算法是一种通过调用自身来解决问题的方法。它通常用于解决那些可以通过子问题的解来构建整个...
* 搜索链表最后一个结点并打印其数值的递归算法 * 汉诺塔问题的递归算法 9. 递归算法的实现细节: * 递归函数的实现细节取决于具体的问题和语言。 * 递归函数的实现细节需要考虑栈的溢出和性能问题。 递归...
3. **可读性和实现难度**:递归算法通常代码简洁,易于理解,而非递归算法可能需要更复杂的逻辑来模拟递归行为。 总的来说,选择哪种实现方式取决于具体场景,如内存限制、性能要求以及代码的可读性等。递归版本的...
递归算法是指在程序设计中,在调用一个函数的过程中又出现直接或间接调用其函数本身的现象。递归算法的优点是编写容易,结构清晰,可读性强,但是其缺点是计算速度慢,时间花费较长,效率也会随着问题规模的增大而...
递归版本的折半查找算法与非递归版本的主要区别在于使用了函数调用自身的方式来实现查找区间对半分割的过程。递归版本通常更简洁,但可能会增加程序的调用栈开销。 #### 四、C语言实现 以下是一个使用C语言实现...
递归实现通过不断地自我调用来计算结果,而非递归实现则使用循环结构来逐步累积结果。 #### 三、递归算法设计实例 本章节通过具体的实例进一步阐述递归算法的应用。 **经典案例:斐波那契数列** 斐波那契数列是...
18.递归算法与递归算法应用.ppt
递归算法是通过函数或过程调用自身来解决复杂问题的方式,而非递归算法则是通过循环或其他逻辑结构来实现相同的目标。这里我们将详细探讨这两种算法在C++中的应用。 首先,递归算法的核心在于它将大问题分解为小的...
递归算法是一种强大的编程技术,它通过函数或过程在解决问题时调用自身来解决更小规模的相同问题。递归的基本概念在于一个函数在定义中包含对自身的引用,或者问题的解决方案依赖于较小规模问题的解决方案。在程序...
递归算法的本质可以概括为两个关键步骤:**回溯**和**递推**。回溯是指从目标出发逐步分解问题,直到问题简单到可以直接求解;递推则是指从这些简单的子问题逐步合并回原始问题的解决方案。 - **回溯**:在这个阶段...
递归算法转为非递归算法。方法、过程,用栈的原理
对于n个圆盘的情况,非递归算法的核心在于通过交替执行两个步骤来移动圆盘: 1. **步骤1**:根据圆盘数量的奇偶性,按顺时针方向将圆盘1从当前柱子移动到下一柱子。如果圆盘1在A,移到B;如果在B,移到C;如果在C,...
快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现 实现树与...
通过构建一个虚拟的满二叉树模型,每个节点代表一次盘子的移动,而非实际创建物理上的二叉树结构,算法得以简化并避免了递归带来的额外开销。 #### 五、算法实现细节 非递归算法的核心在于如何通过模拟二叉树的...
在递归算法中,我们定义一个函数来调用自身,直到达到基本情况(base case),即不再需要进一步的递归。 以下是在VB6.0中使用递归实现阶乘的步骤: 1. **定义函数**:首先,我们需要定义一个名为`Factorial`的函数...