- 浏览: 524406 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
飞天奔月:
public List<String> gener ...
实践中的重构30_不做油漆匠 -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道public class A {
...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道在世界的中心呼喚愛 写道在classB ...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道在classB的finalize上打断 ...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
iteye比较少上,如果可以的话,可以发e-mail交流:ch ...
深入理解ReferenceQueue GC finalize Reference
有这么一段代码,是用来解析国内的地址信息的。
AddressInfo对象唯一确定一个地址信息,该地址信息可以是省市区县任意一级的地址信息,省级地址为市级地址的父地址,市级地址是区县地址的父地址。AddressInfo对象里面存储了父地址的地址码,当地址码为null或者查找不到该地址码对应的地址时,认为该AddressInfo对象为省级地址。系统提供了查找一个地址码对应父地址的方法,。
该段代码有以下问题可以改进。
1 代码命名不好。
2 结构有重复。
利用递归可以提高该段代码的可维护性。
因为这里的重复结构只有3层,递归的好处没有得到淋漓尽致的体现。尽管如此,这里采用递归以后减少了重复的代码,并且提高了代码的可维护性。
如果遇到同类问题,当层次较为多时,递归的优点就可以得到充分体现了。
但是值得注意的是,当使用递归时,固然可以提高程序的可读性,但是如果层次太多,有可能导致调用栈太深,从而消耗大量的内存空间,影响性能,甚至抛出栈空间不足异常,这种情况下可以考虑转换为迭代的形式或者尾递归的形式。
AddressInfo对象唯一确定一个地址信息,该地址信息可以是省市区县任意一级的地址信息,省级地址为市级地址的父地址,市级地址是区县地址的父地址。AddressInfo对象里面存储了父地址的地址码,当地址码为null或者查找不到该地址码对应的地址时,认为该AddressInfo对象为省级地址。系统提供了查找一个地址码对应父地址的方法,。
/** * 获取省、市、区的数组 * * @param info * 地址信息 * @return 3个元素的字符串数组 第一个表示省,第二个表示市,第三个表示区/县 */ private String[] getAddressArrayByInfo(AddressInfo info) { int addessArrayLength = 3; int provincePosition = 0; int cityPosition = 1; int areaPosition = 2; String[] result = new String[addessArrayLength]; if (info == null) { return result; } if (info.getParentAreaCode() == null) { result[provincePosition] = info.getName(); return result; } AddressInfo parentInfo = findAddressByAreaCode(info.getParentAreaCode()); if (parentInfo == null) { result[provincePosition] = info.getName(); return result; } if (parentInfo.getParentAreaCode() == null) { result[provincePosition] = parentInfo.getName(); result[cityPosition] = info.getName(); return result; } AddressInfo provInfo = findAddressByAreaCode(parentInfo .getParentAreaCode()); if (provInfo == null) { result[provincePosition] = parentInfo.getName(); result[cityPosition] = info.getName(); return result; } result[provincePosition] = provInfo.getName(); result[cityPosition] = parentInfo.getName(); result[areaPosition] = info.getName(); return result; }
该段代码有以下问题可以改进。
1 代码命名不好。
2 结构有重复。
利用递归可以提高该段代码的可维护性。
private static int AddressLength = 3; /** * 获取省、市、区的数组 * * @param info * 地址信息 * @return 3个元素的字符串数组 第一个表示省,第二个表示市,第三个表示区/县 */ public String[] getAddressArrayByInfo2(AddressInfo info) { String[] addressArray = new String[AddressLength]; addAddressToArray(addressArray, info); return addressArray; } /** * 将指定地址放入addressArray中。 原有的addressArray的值依次后移1位,第一个空位由指定地址填充。 * * <pre> * Note:由于中国的行政划分基本不会变,所以这里可以用常数。 * </pre> * */ private void addAddressToArray(String[] addressArray, AddressInfo info) { if (info == null) return; addressArray[2] = addressArray[1]; addressArray[1] = addressArray[0]; addressArray[0] = info.getName(); String parentAreaCode = info.getParentAreaCode(); if (parentAreaCode == null) { return; } addAddressToArray(addressArray, findAddressByAreaCode(parentAreaCode)); }
因为这里的重复结构只有3层,递归的好处没有得到淋漓尽致的体现。尽管如此,这里采用递归以后减少了重复的代码,并且提高了代码的可维护性。
如果遇到同类问题,当层次较为多时,递归的优点就可以得到充分体现了。
但是值得注意的是,当使用递归时,固然可以提高程序的可读性,但是如果层次太多,有可能导致调用栈太深,从而消耗大量的内存空间,影响性能,甚至抛出栈空间不足异常,这种情况下可以考虑转换为迭代的形式或者尾递归的形式。
评论
2 楼
william_ai
2011-01-06
区域问题,可以用自定义编码的方式来做。
如省2位,市2位,区2位
设:
就可以得出以下编码
求A1省所有的所有市、区:找出编码大于010000小于等于019999的即可。
也可以用写sql来做。ORACLE的话可以直接写sql
如省2位,市2位,区2位
设:
A1省01,B1市01,C1区01 A1省01,B2市02,C1区01 A1省01,B2市02,C2区02 A2省02,B1市01,C1区01
就可以得出以下编码
A1省 :010000 A1省B1市 :010100 A1省B1市C1区:010110 A1省B2市 :010200 A1省B2市C1区:010201 A1省B2市 :010200 A1省B2市C2区:010202 A2省 :020200 A2省B1市 :020201 A2省B1市C1区:020201
求A1省所有的所有市、区:找出编码大于010000小于等于019999的即可。
也可以用写sql来做。ORACLE的话可以直接写sql
select AREA_ID from AREA_TM connect by prior AREA_ID = PARENT_AREA_ID start with AREA_ID = ?;
1 楼
抛出异常的爱
2011-01-06
核心三件事:
测试代码:
JXPathContext context = JXPathContext.newContext(info); String[] arry = (String[]) IteratorUtils.toArray(it,String.class); String[] result = Arrays.copyOf(arry, 4);
测试代码:
import java.util.Iterator; import org.apache.commons.collections.IteratorUtils; import org.apache.commons.jxpath.JXPathContext; import org.apache.commons.lang.ArrayUtils; public class JxpathDemo { JxpathDemo father; String name; public JxpathDemo() { } public JxpathDemo(String name){ this.name = name ; } public JxpathDemo getFather() { return father; } public void setFather(JxpathDemo father) { this.father = father; } public String getName() { return name; } public void setName(String name) { this.name = name; } /** * @param args */ public static void main(String[] args) { JxpathDemo son = new JxpathDemo("son diver the hose"); JxpathDemo me = new JxpathDemo("i 'm a big man"); JxpathDemo father = new JxpathDemo(" father in house"); JxpathDemo grandFather = new JxpathDemo("grand fater sleepping"); son.setFather(me); // me.setFather(father); // father.setFather(grandFather); JXPathContext context = JXPathContext.newContext(son); Iterator<String> it = context.iterate("//name"); String[] arry = (String[]) IteratorUtils.toArray(it,String.class); String[] result = Arrays.copyOf(arry, 4); for(String o:result) System.out.println(o) } }
发表评论
-
实践中的重构32_使用标准的IO操作写法。
2012-07-14 18:42 1360看到这样一段代码,功能为读取一个指定文件的内容然后返回。 ... -
实践中的重构31_结果类两种实现的比较
2011-09-13 19:58 1068在查询接口结果类设计 ... -
实践中的重构30_不做油漆匠
2011-08-15 23:42 1233油漆匠的故事是编程文化中的一个著名故事。本地化如下。 小强毕业 ... -
实践中的重构29_不自动的自动化测试
2011-07-31 18:00 1036测试的精髓之一就是自 ... -
实践中的重构28_小心怀疑类库
2011-07-24 10:25 1038一般而言,类库的使用频率较高,场景较多,隐藏的bug就较少。 ... -
实践中的重构27_不要忘了内存空间
2011-06-06 18:31 1163方法在设计中,一般关注的是方法的功能契约,即方法需要什么样的参 ... -
实践中的重构26_奇怪的接口注释
2011-06-06 16:10 1330最近又看到奇怪的注释。 /** * 用户查询服务。 ... -
实践中的重构25_UT也需要持续重构
2011-05-01 11:20 957UT是个好东西,在对代 ... -
实践中的重构24_持续的方法重构
2011-05-01 02:20 1064很少有人可以一遍就写出好的代码。写代码和写文章差不多,大部分人 ... -
实践中的重构23_详尽的注释未必是好注释
2011-03-20 17:37 1501注释一直是软件开发中的一个老大难问题。 代码中一个注释都没有是 ... -
实践中的重构22_不要垃圾
2011-03-20 13:31 1038Java引入了GC当然很好,减轻了程序员手工管理内存的负担,但 ... -
实践中的重构21_给她一个好名字
2011-03-20 13:03 896名字的重要性实在是再怎么强调都不为过的。 为什么名字这么重要呢 ... -
实践中的重构20_一段可笑的异常处理逻辑
2011-03-06 20:32 1664Code review也是一个充满 ... -
实践中的重构19_脱裤子放屁
2011-03-03 23:17 2012每当看到代码中有一个 ... -
实践中的重构18_不对称的美
2011-02-26 22:30 968一般而言,自然界是以 ... -
实践中的重构17_表驱动法
2011-02-22 00:10 837代码以及初始的单元测试见 http://zhang-xzhi- ... -
实践中的重构16_多即是少
2011-01-16 23:44 1501在编写UT的过程中,随处可见重复,硬编码等等使得代码僵化的代码 ... -
实践中的重构15_null的意义和集合类作为方法结果类型
2011-01-12 22:16 629在编程中,估计null应该是一个很常写的词汇了。 实践中,经常 ... -
实践中的重构14_用方法设计保证正确性
2011-01-04 21:40 988一般来说,方法的调用方遵循方法的契约调用某方法来完成某功能。每 ... -
实践中的重构12_不要乱用异常
2010-12-30 00:36 1466code review的时候,发现了如下代码。 /** ...
相关推荐
递归图(reecurrence plots),从相空间重构时间序列的matlab程序,
可以通过CC 方法进行相空间重构,计算嵌入维数和延迟时间,在此基础上,对单音素语音进行递归图和递归定量分析。
递归图工具和递归量化分析指标对复杂系统的分析
DFT_2_L_通用递归分解算法GRFA DFT_2_L_通用递归分解算法GRFA
语法分析器C源代码_动态建表_非递归预测分析 语法分析器C源代码_动态建表_非递归预测分析
Matlab 递归函数,通过几个参数的输入,实现递归调用
Pospro写的一个Python程序:利用递归法和pygame实现迷宫寻路的动态展示
用递归方法编写函数,Fibonacci级数,公式fib(n)=fib(n-1)+fib(n-2)
一个很全面的二叉树遍历算法,其中包括递归,非递归,广度遍历,输入,输出。
Java__递归算法.mp4
一维信号生成对应递归图,用于分类,识别,特征提取
Java数组排序总结(冒泡_选择_插入_希尔)__递归算法的复杂度,实用
WinForm_TreeView递归绑定Demo,可以参考如何时候递归实现TreeView的绑定
JAVA_SQL递归树形,用递归算法结合数据库对J2EE实现树结构
主要是针对非线性实现序列的Recurrence_plots递归结构图的源代码,可以解决相应的画图问题,可以下载看一下,根据官方提供的文档进行数据提取与编写。有什么疑问可以留言进行回复。
tsp递归程序实现(Java)
java代码统计_递归