边城愚人

如果我不在边城,我一定是在前往边城的路上。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  31 随笔 :: 0 文章 :: 96 评论 :: 0 Trackbacks

06 2007 档案

     摘要: 经常地,你必须遍历一个对象集合并基于一些条件(criteria)来过滤它们。JDK提供了有用的机制来排序集合,即Comparator接口。然而,JDK缺少过滤集合的机制。

这篇文章描述了一个仅由一个类和一个接口组成的简单机制,它允许你快速和灵活地过滤集合。当搜索一个集合时,该机制提供了与SQL中的select语句相同的功能。它的隐含的概念是,在遍历集合和过滤集合中的对象时,达到职责的分离。
这里提出的方法有下面的优点:
1、一个核心的过滤器组件的复用产生更清晰的代码。
2、通用过滤组件的复用产生更免于错误的代码。
3、从过滤逻辑中分离出迭代逻辑使你任意地增加和删除过滤器而不影响到其他代码。
4、对于大集合和多个criteria能够获得性能提高。  阅读全文
posted @ 2007-06-30 22:22 kafka0102 阅读(1333) | 评论 (1)  编辑

     摘要: 对于没有使用过Calendar的程序员来说,再次处理日期时不妨使用Calendar而不仅仅是Date和SimpleDateFormat等类。这篇文章根据几个使用日期的场景来说明如何使用Calendar等类。
在数据库编程时,我们通常将java日期字段选作Date型的(一般是java.sql.Date,继承于java.util.Date,使用方法是类似的),当然也可以存储为字符串甚至是long型的time,但我们这里只讨论date型的。如果存储的时间是系统当前时间,我们可以使用Date d = new Date();就得到想要的时间;以前我编程时也指定存储日期的格式,但现在想来不是很有必要,完全可以在读出数据时指定格式。另一种可选的方法是使用 Calendar类,方法如下:  阅读全文
posted @ 2007-06-22 08:40 kafka0102 阅读(4068) | 评论 (0)  编辑

     摘要: 最近在看一个程序,该程序的图形界面采用SWT编写。想要将程序运行起来首先需要做的就是将swt(jface)包放到类路径上,swt包可以从http://www.eclipse.org/swt下载(其中除了swt包还有和操作系统相关的文件),和swt开发相关的插件为VE。一切就绪,运行程序发现了“Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-pi-gtk-3232 in java.library.path ”的错误(我的操作系统为Ubuntu7.04)。解决方案有多种,这里只介绍我使用的一种方法。  阅读全文
posted @ 2007-06-21 09:11 kafka0102 阅读(13611) | 评论 (1)  编辑

     摘要: 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+ Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。
构造哈夫曼树的算法如下:
1)对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,..., Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。
2)在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
3)从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
4)重  阅读全文
posted @ 2007-06-21 08:23 kafka0102 阅读(12237) | 评论 (7)  编辑

     摘要: 设有主串s和子串t,子串t定位是指在主串s中找到一个与子串t相等的子串。通常把主串s称为目标串,把子串t称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串s中找到一个模式串t。

传统的字符串模式匹配算法(也就是BF算法)就是对于主串和模式串双双自左向右,一个一个字符比较,如果不匹配,主串和模式串的位置指针都要回溯。这样的算法时间复杂度为O(n*m),其中n和m分别为串s和串t的长度。

KMP算法是由Knuth,Morris和Pratt等人共同提出的,所以成为Knuth-Morris-Pratt算法,简称KMP算法。KMP算法是字符串模式匹配中的经典算法。和BF算法相比,KMP算法的不同点是匹配过程中,主串的位置指针不会回溯,这样的结果使得算法时间复杂度只为O(n+m)。下面说说KMP算法的原理。  阅读全文
posted @ 2007-06-17 22:14 kafka0102 阅读(9677) | 评论 (6)  编辑

     摘要: 做java企业级开发时,我们通常采用三层架构。特别地,如果我们要做的系统的业务逻辑不是很复杂时,我们要处理的不过是CRUD操作,这时我们可能将dao层与service层合并为一层,尽管很多人会这样做,但我仍倾向于将两层分开;因为service与dao不是一一对应的,从复用及逻辑清晰的角度考虑,应该将它们分开。在三层架构下,对于web层,service层,dao层我们都该怎么测试?这里我将介绍基于Spring,Hibernate和DbUnit的情况下我的测试方法。由于使用了Spring,事务管理就不在dao,因此要单独地测试dao可能要麻烦一些;另一方面,dao中的操作大多是简单的,也不是很值得测试。在使用了Hibernate和Spring的情况下,我们要测试的除了HQL,还有其配置文件,我觉得对数据持久化的测试最好定在service上。如果service业务逻辑复杂的话,与数据持久化无关的业务逻辑(应该写在领域对象中)可以单独测试,在保证与数据持久化无关的业务逻辑的正确性下,带上dao操作做集成(单元)测试。  阅读全文
posted @ 2007-06-14 09:18 kafka0102 阅读(1464) | 评论 (0)  编辑

     摘要: 在做Java企业程序的时候,不可避免地要和外部资源打交道,比如数据库,Http请求等。对于这些外部资源的处理,我们可采取的操作或者是直接处理或者是模拟处理。当我们使用Webwork,Spring,Hibernate等框架时,我们要测试的并不仅仅是Java代码,我们还要测试依赖于这些框架的配置文件等等。因此,对于数据持久化的测试,Mock方法是行不通的,我们需要真实地测试数据库操作。对于持久化测试来说,重要的是创造出已知的“干净的”的准备数据。如果我们在测试一个持久化方法前不能确定数据库到底存着什么数据,我们只能通过反复地查看数据库数据来验证测试方法的正确性了(这就是我和大多数人以前使用的最“直接”的方法)。现在就让我们使用DbUnit,来更好的更自动化的测试持久化操作吧!

先介绍一下DbUnit。DbUnit是一个 JUnit扩展,适用于数据驱动的程序。使用DbUnit,可以在测试运行期间将数据库的数据处于已知状态,这样在测试时可以方便地写出测试断言,也能自动地完成对数据持久化方法的测试。在使用上,DbUnit也很简单, 它提供了大量的  阅读全文
posted @ 2007-06-14 09:03 kafka0102 阅读(2760) | 评论 (2)  编辑

     摘要: 很早就知道Jetty,但直到最近才使用它作为Web服务器。Jetty是一个开放源码的HTTP服务器和Java serverlet容器,是完全使用Java语言实现的。作为嵌入的Web服务器,Jetty被广泛应用,比如DWR,JBoss,Geronimo,Tapestry中都使用了Jetty。相比于其他Web服务器,Jetty最大的有点就是小巧且启动速度快。当前的Jetty最新版本为6,相比以前的版本“重”了不少,“重”的原因自然是功能的增强。我使用myeclipse插件开发Web程序,Web服务器从Tomcat转换成Jetty只需改变一下程序部署的位置而已。  阅读全文
posted @ 2007-06-11 15:48 kafka0102 阅读(1866) | 评论 (1)  编辑