从8.1号开始,连续加班,再过1小时结束。
posted @
2006-09-21 02:39 nake 阅读(973) |
评论 (4) |
编辑 收藏
排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。
如将下列数字进行排序
1,3,5,8,3,6
于是我们得出结果
1,3,3,5,6,8
将下列字母(字符)进行排序
a,i,e,f,w,s
于是我们得出结果
a,e,f,i,s,w
但是我们遇到的情况就不是如此简单了。如给公司里的商品进行排序,我们很轻易的想到按照商品的名称排序不就完了,而且简单明了。但现实并如我们相信般简单。同一商品名称可以有不同的批次,进货时间,可能还会有单价的不同。显然只根据商品名称排序是不合理的。
再举个简单例子然后用程序实现。如公司要将员工进行排序(不要说领导排在前面),假设我们的需求比较复杂。先进行姓排序,谁的姓拼音靠前,谁就排前面。然后对名字进行排序。恩.如果同名,女性排前头。如果名字和性别都相同,年龄小的排前头。ok,一个也不算复杂的需求。
如果对java比较熟悉的会知道java.util.Comparator 接口。要实现里面的函数
int compare(Object o1, Object o2) 返回一个基本类型的整型,返回负数表示o1 小于o2,返回0 表示o1和o2相等,返回正数表示o1大于o2。
于是我们设计的人员类要有几个变量,firstname,lastname,sex,age分别表示姓,名,性别,年龄。
public class Person {
String firstname,lastname;
Boolean sex;
Integer age;
public Person(String firstname,String lastname,Boolean sex,Integer age) {
this.firstname = firstname;
this.lastname = lastname;
this.sex = sex;
this.age = age;
}
public String getFirstName() {
return firstname;
}
public String getLastName() {
return lastname;
}
public Boolean getSex() {
return sex;
}
public Integer getAge() {
return age;
}
//为了输入方便,重写了toString()
public String toString()
{
return firstname +" "+lastname+" "+(sex.booleanValue()?"男":"女")+" "+age;
}
}
//end person
下面是要实现比较器
public class Comparators {
public static java.util.Comparator getComparator() {
return new java.util.Comparator() {
public int compare(Object o1, Object o2) {
if (o1 instanceof String) {
return compare( (String) o1, (String) o2);
}
else if (o1 instanceof Integer) {
return compare( (Integer) o1, (Integer) o2);
}
else if (o1 instanceof Person) {
return compare( (Person) o1, (Person) o2);
}
else {
System.err.println("未找到合适的比较器");
return 1;
}
}
public int compare(String o1, String o2) {
String s1 = (String) o1;
String s2 = (String) o2;
int len1 = s1.length();
int len2 = s2.length();
int n = Math.min(len1, len2);
char v1[] = s1.toCharArray();
char v2[] = s2.toCharArray();
int pos = 0;
while (n-- != 0) {
char c1 = v1[pos];
char c2 = v2[pos];
if (c1 != c2) {
return c1 - c2;
}
pos++;
}
return len1 - len2;
}
public int compare(Integer o1, Integer o2) {
int val1 = o1.intValue();
int val2 = o2.intValue();
return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1));
}
public int compare(Boolean o1, Boolean o2) {
return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));
}
public int compare(Person o1, Person o2) {
String firstname1 = o1.getFirstName();
String firstname2 = o2.getFirstName();
String lastname1 = o1.getLastName();
String lastname2 = o2.getLastName();
Boolean sex1 = o1.getSex();
Boolean sex2 = o2.getSex();
Integer age1 = o1.getAge();
Integer age2 = o2.getAge();
return (compare(firstname1, firstname2) == 0 ?
(compare(lastname1, lastname2) == 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0 :
compare(age1, age2)) :
compare(sex1, sex2)) :
compare(lastname1, lastname2)) :
compare(firstname1, firstname2));
}
};
}
}
以上代码有可能因为浏览器的布局自动换行。
compare(Person o1, Person o2)的返回值看起来比较别扭。最简单的是
public int compare(Boolean o1, Boolean o2) {
return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));
}
o1和o2相等返回0,否则o1如果是true 就表示o1大于o2。
再尝试输出结果看看
public class Main {
public Main() {
}
public static void main(String[] args) {
Person[] person = new Person[] {
new Person("ouyang", "feng", Boolean.TRUE, new Integer(27)),
new Person("zhuang", "gw", Boolean.TRUE, new Integer(27)),
new Person("zhuang", "gw", Boolean.FALSE, new Integer(27)),
new text.Person("zhuang", "gw", Boolean.FALSE, new Integer(2)),
};
for (int i = 0; i < person.length; i++) {
System.out.println("before sort=" + person[i]);
}
java.util.Arrays.sort(person, Comparators.getComparator());
for (int i = 0; i < person.length; i++) {
System.out.println("after sort=" + person[i]);
}
}
}
输出结果:
before sort=ouyang feng 男 27
before sort=zhuang gw 男 27
before sort=zhuang gw 女 27
before sort=zhuang gw 女 2
after sort=ouyang feng 男 27
after sort=zhuang gw 女 2
after sort=zhuang gw 女 27
after sort=zhuang gw 男 27
仔细理解java的Comparator会给你写排序带来很大帮助
posted @
2006-05-27 17:20 nake 阅读(2277) |
评论 (5) |
编辑 收藏
软件项目,特别是给企业用户的项目,实施过程大多辛苦,而且一部分问题不在于软件本身。
总结一下项目最后验收阶段案例之一。
案例:项目已经按照客户确认的调研文档完成实施工作。客户的一把手提出新需求。
此一把手H,H精通业务,对电脑一窍不通。H对手下电脑部负责人Z提出“要对业务进行风险管理,把风险大的业务提出来。”,一句话令Z头大。Z苦恼H没有定义什么是风险大,即使H说明风险大的条件,现有的软件架构,数据模型能否实现还是未知数。实现此功能成为不可完成的任务。持续下去Z和项目经理W(软件公司负责人)都面临困境。
Z会被认为没有完成领导安排的工作(实际上他忙的焦头烂额)。
W进入两难,一方面客户要求的完成不了,另一方面面临公司的的项目要拖延。
解决办法:1.按章办事,调研文档已经写清楚无此需求。直接拒绝。此为下策,没办法才用,但是关键时刻很有用。
2.引导+忽悠。对付H这种老总要从其公司内部出发。分析满足他需求所需要的条件。一般要牺牲部分工作人员的工作时间。然后把影响放大,吓唬他。如果可以的话可以找他们的相关人员帮忙,让他听到不同的声音,让他放弃此念头。因为软件他是外行,谈论软件时心里没底气,有自己人反对,心虚。
比如从财务着手比较有效。要满足H的需求改变了财务的核算体系,原有的数据都要加上某写核算项,不能保证数据准确性,而且大大增加了财务工作量,而且不符合会计制度(忽悠)。上策!
posted @
2006-05-16 17:46 nake 阅读(3239) |
评论 (2) |
编辑 收藏
转载请注明出处:http://www.blogjava.net/nake/
自从
java
发布的第一个版本开始就已经包含
JDBC
了。目前已经有
10
个年头了。
JDBC4.0
将要被打包到
java6.0
里(
java SE
是
J2SE
新的名字)。它展现设计的重大提升和提供更加丰富的
API
,更加重视简易开发和提高生产力
。
本文将讨论一些
JDBC
在改善设计和提高性能上的重要的变化。但是不能列举每一个变化。
注解和泛型
我想你已经了解了包含在
JAVA 5.0
的注解(
annotations
)
和泛型(
generic
也有翻译范型)。
JDBC4.0
也引进了注解和泛型
DataSet
,这使得执行
sql
语句和
SQL DML
(
data manipulation language
)
定义变的简单。
在新的
API
里定义了一套
Query
和
DataSet
接口。
Query
接口定义了一套方法,这些方法描述了
SQL
的
select
和
update
语句。而且详细介绍了结果集如何绑定为一个
DataSet
的。因为泛型所以
DataSet
是可以带参数的。因此可以说
DataSet
接口是类型安全的(
type-saft
)
.
所有
Query
接口都要从
BaseQuery
接口继承。可以通过
Connection.createQueryObject()
或者
DataSource.createQueryObject()
得到Query对象。
一个DataSet接口都继承java.util.List。
DataSet
是有列概念的数据集,能从
Query
接口得到,并且可以带有参数。
DataSet
可以在连接和断开连接的情况下使用。从而
DataSet
实现了
ResultSet
(连接)
或者
CachedRowSet
(可以断开连接)。因为DataSet是java.util.List的子接口,所以可以通过java.util.Iterator来访问每一行。
DataSet
接口可以带系统或者用户自己定义的类作为参数。通过两种方法你可以实现:构造函数或者
JavaBeans
对象,任何一个办法都能达到将用户自定义的类绑定到结果集的列里。但是在其它支持
JavaBeans
的框架里,用
JavaBeans
对象的实现就显更加容易使用。
下面简单举例说明如何通过新的
API
创建和运行
SQL
查询。用用户自定义的类来定义结果集。(拷贝时候小心有制表符)
pubic class Employee {
private int employeeId;
private String firstName;
private String lastName;
public int getEmployeeId() {
return employeeId;
}
public setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getFirstName() {
return firstName;
}
public setFirstName(String firstName) {
this.firstName = firstName;
}
pubic String lastName() {
return lastName;
}
public setLastName(String lastName) {
this.lastName = lastName;
}
}
interface EmployeeQueries extends BaseQuery {
@Select (sql="SELECT employeeId, firstName, lastName FROM employee")
DataSet<Employee> getAllEmployees ();
@Update (sql="delete from employee")
int deleteAllEmployees ();
}
Connection con = ...
EmployeeQueries empQueries = con.createQueryObject (EmployeeQueries.class);
DataSet<Employee> empData = empQueries.getAllEmployees ();
异常处理的增强:
1.
为
SQLException
分为两类
transient
和
non-transient
。
2.
支持连锁的异常。
3.
继承了
Iterable
接口。
因为继承了Iterable 所以你可以这样写:
catch(SQLException ex) {
for(Throwable t : ex) {
System.out.println("exception:" + t);
}
}
参考
http://www.javaworld.com/javaworld/jw-05-2006/jw-0501-jdbc.html
JSR 221: JDBC 4.0 Specification:
http://www.jcp.org/en/jsr/detail?id=221
未完
posted @
2006-05-11 22:26 nake 阅读(6753) |
评论 (4) |
编辑 收藏