posts - 39,  comments - 263,  trackbacks - 0
           
          從8.1號開始,連續加班,再過1小時結束。
          posted @ 2006-09-21 02:39 nake 閱讀(978) | 評論 (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 閱讀(2288) | 評論 (5)編輯 收藏
          ?

          軟件項目,特別是給企業用戶的項目,實施過程大多辛苦,而且一部分問題不在于軟件本身。

          總結一下項目最后驗收階段案例之一。

          案例:項目已經按照客戶確認的調研文檔完成實施工作??蛻舻囊话咽痔岢鲂滦枨蟆?/p>

          此一把手H,H精通業務,對電腦一竅不通。H對手下電腦部負責人Z提出“要對業務進行風險管理,把風險大的業務提出來。”,一句話令Z頭大。Z苦惱H沒有定義什么是風險大,即使H說明風險大的條件,現有的軟件架構,數據模型能否實現還是未知數。實現此功能成為不可完成的任務。持續下去Z和項目經理W(軟件公司負責人)都面臨困境。

          Z會被認為沒有完成領導安排的工作(實際上他忙的焦頭爛額)。

          W進入兩難,一方面客戶要求的完成不了,另一方面面臨公司的的項目要拖延。

          解決辦法:1.按章辦事,調研文檔已經寫清楚無此需求。直接拒絕。此為下策,沒辦法才用,但是關鍵時刻很有用。

          2.引導+忽悠。對付H這種老總要從其公司內部出發。分析滿足他需求所需要的條件。一般要犧牲部分工作人員的工作時間。然后把影響放大,嚇唬他。如果可以的話可以找他們的相關人員幫忙,讓他聽到不同的聲音,讓他放棄此念頭。因為軟件他是外行,談論軟件時心里沒底氣,有自己人反對,心虛。

          比如從財務著手比較有效。要滿足H的需求改變了財務的核算體系,原有的數據都要加上某寫核算項,不能保證數據準確性,而且大大增加了財務工作量,而且不符合會計制度(忽悠)。上策!

          posted @ 2006-05-16 17:46 nake 閱讀(3247) | 評論 (2)編輯 收藏

          轉載請注明出處:http://www.aygfsteel.com/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
          參考

        1. http://www.javaworld.com/javaworld/jw-05-2006/jw-0501-jdbc.html
        2. JSR 221: JDBC 4.0 Specification:
        3. http://www.jcp.org/en/jsr/detail?id=221
          未完

          posted @ 2006-05-11 22:26 nake 閱讀(6769) | 評論 (4)編輯 收藏
          僅列出標題
          共10頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(18)

          我參與的團隊

          隨筆檔案(39)

          收藏夾(1)

          搜索

          •  

          積分與排名

          • 積分 - 451353
          • 排名 - 119

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 珲春市| 西城区| 虞城县| 青岛市| 黄骅市| 武川县| 中卫市| 迁西县| 阿尔山市| 赣州市| 鄂州市| 淮安市| 沽源县| 类乌齐县| 梁河县| 桐庐县| 洪泽县| 昆明市| 上杭县| 肃北| 茂名市| 新乐市| 乐业县| 永宁县| 宜春市| 宣威市| 嵊泗县| 富平县| 科技| 衡南县| 高台县| 宜兰县| 嵊泗县| 宜阳县| 双峰县| 泉州市| 即墨市| 盘锦市| 苏尼特右旗| 平塘县| 余庆县|