posts - 39,  comments - 263,  trackbacks - 0
 
从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)编辑 收藏
 

软件项目,特别是给企业用户的项目,实施过程大多辛苦,而且一部分问题不在于软件本身。

总结一下项目最后验收阶段案例之一。

案例:项目已经按照客户确认的调研文档完成实施工作。客户的一把手提出新需求。

此一把手HH精通业务,对电脑一窍不通。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 (可以断开连接)。因为DataSetjava.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);
   }
}

SQLExceptions.JPG
参考

  • 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)编辑 收藏
    仅列出标题
    共10页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last 
    <2024年11月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    常用链接

    留言簿(18)

    我参与的团队

    随笔档案(39)

    收藏夹(1)

    搜索

    •  

    积分与排名

    • 积分 - 450861
    • 排名 - 118

    最新评论

    阅读排行榜

    评论排行榜