排序的算法是我們最常用的算法,初學程序,每個人都嘗試過排序。但只是局限于簡單的排序。
如將下列數(shù)字進行排序
1,3,5,8,3,6
于是我們得出結(jié)果
1,3,3,5,6,8
將下列字母(字符)進行排序
a,i,e,f,w,s
于是我們得出結(jié)果
a,e,f,i,s,w
但是我們遇到的情況就不是如此簡單了。如給公司里的商品進行排序,我們很輕易的想到按照商品的名稱排序不就完了,而且簡單明了。但現(xiàn)實并如我們相信般簡單。同一商品名稱可以有不同的批次,進貨時間,可能還會有單價的不同。顯然只根據(jù)商品名稱排序是不合理的。
再舉個簡單例子然后用程序?qū)崿F(xiàn)。如公司要將員工進行排序(不要說領導排在前面),假設我們的需求比較復雜。先進行姓排序,誰的姓拼音靠前,誰就排前面。然后對名字進行排序。恩.如果同名,女性排前頭。如果名字和性別都相同,年齡小的排前頭。ok,一個也不算復雜的需求。
如果對java比較熟悉的會知道java.util.Comparator 接口。要實現(xiàn)里面的函數(shù)
?int compare(Object o1, Object o2) 返回一個基本類型的整型,返回負數(shù)表示o1 小于o2,返回0 表示o1和o2相等,返回正數(shù)表示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
下面是要實現(xiàn)比較器
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。
再嘗試輸出結(jié)果看看
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]);
? }
? }
}
輸出結(jié)果:
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會給你寫排序帶來很大幫助
?
軟件項目,特別是給企業(yè)用戶的項目,實施過程大多辛苦,而且一部分問題不在于軟件本身。
總結(jié)一下項目最后驗收階段案例之一。
案例:項目已經(jīng)按照客戶確認的調(diào)研文檔完成實施工作。客戶的一把手提出新需求。
此一把手H,H精通業(yè)務,對電腦一竅不通。H對手下電腦部負責人Z提出“要對業(yè)務進行風險管理,把風險大的業(yè)務提出來。”,一句話令Z頭大。Z苦惱H沒有定義什么是風險大,即使H說明風險大的條件,現(xiàn)有的軟件架構(gòu),數(shù)據(jù)模型能否實現(xiàn)還是未知數(shù)。實現(xiàn)此功能成為不可完成的任務。持續(xù)下去Z和項目經(jīng)理W(軟件公司負責人)都面臨困境。
Z會被認為沒有完成領導安排的工作(實際上他忙的焦頭爛額)。
W進入兩難,一方面客戶要求的完成不了,另一方面面臨公司的的項目要拖延。
解決辦法:1.按章辦事,調(diào)研文檔已經(jīng)寫清楚無此需求。直接拒絕。此為下策,沒辦法才用,但是關鍵時刻很有用。
2.引導+忽悠。對付H這種老總要從其公司內(nèi)部出發(fā)。分析滿足他需求所需要的條件。一般要犧牲部分工作人員的工作時間。然后把影響放大,嚇唬他。如果可以的話可以找他們的相關人員幫忙,讓他聽到不同的聲音,讓他放棄此念頭。因為軟件他是外行,談論軟件時心里沒底氣,有自己人反對,心虛。
比如從財務著手比較有效。要滿足H的需求改變了財務的核算體系,原有的數(shù)據(jù)都要加上某寫核算項,不能保證數(shù)據(jù)準確性,而且大大增加了財務工作量,而且不符合會計制度(忽悠)。上策!
轉(zhuǎn)載請注明出處:http://www.tkk7.com/nake/
???自從
java
發(fā)布的第一個版本開始就已經(jīng)包含
JDBC
了。目前已經(jīng)有
10
個年頭了。
JDBC4.0
將要被打包到
java6.0
里(
java SE
是
J2SE
新的名字)。它展現(xiàn)設計的重大提升和提供更加豐富的
API
,更加重視簡易開發(fā)和提高生產(chǎn)力
。
?????? 本文將討論一些 JDBC 在改善設計和提高性能上的重要的變化。但是不能列舉每一個變化。
注解和泛型
我想你已經(jīng)了解了包含在 JAVA 5.0 的注解( annotations ) 和泛型( generic 也有翻譯范型)。 JDBC4.0 也引進了注解和泛型 DataSet ,這使得執(zhí)行 sql 語句和 SQL? DML ( data manipulation? language ) 定義變的簡單。
?????? 在新的 API 里定義了一套 Query 和 DataSet 接口。 Query 接口定義了一套方法,這些方法描述了 SQL 的 select 和 update 語句。而且詳細介紹了結(jié)果集如何綁定為一個 DataSet 的。因為泛型所以 DataSet 是可以帶參數(shù)的。因此可以說 DataSet 接口是類型安全的( type-saft ) .
所有
Query
接口都要從
BaseQuery
接口繼承。可以通過
Connection.createQueryObject()
或者
DataSource.createQueryObject()
得到Query對象。
一個DataSet接口都繼承java.util.List。
? DataSet
是有列概念的數(shù)據(jù)集,能從
Query
接口得到,并且可以帶有參數(shù)。
DataSet
可以在連接和斷開連接的情況下使用。從而
DataSet
實現(xiàn)了
ResultSet
(連接)
或者
?
CachedRowSet
(可以斷開連接)。因為DataSet是java.util.List的子接口,所以可以通過java.util.Iterator來訪問每一行。
DataSet
接口可以帶系統(tǒng)或者用戶自己定義的類作為參數(shù)。通過兩種方法你可以實現(xiàn):構(gòu)造函數(shù)或者
JavaBeans
對象,任何一個辦法都能達到將用戶自定義的類綁定到結(jié)果集的列里。但是在其它支持
JavaBeans
的框架里,用
JavaBeans
對象的實現(xiàn)就顯更加容易使用。
下面簡單舉例說明如何通過新的
API
創(chuàng)建和運行
SQL
查詢。用用戶自定義的類來定義結(jié)果集。(拷貝時候小心有制表符)
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);
?? }
}
參考
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
27 | 28 | 29 | 30 | 1 | 2 | 3 | |||
4 | 5 | 6 | 7 | 8 | 9 | 10 | |||
11 | 12 | 13 | 14 | 15 | 16 | 17 | |||
18 | 19 | 20 | 21 | 22 | 23 | 24 | |||
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 |
常用鏈接
留言簿(18)
我參與的團隊
隨筆檔案(39)
- 2008年8月 (1)
- 2008年7月 (1)
- 2007年1月 (2)
- 2006年9月 (1)
- 2006年5月 (5)
- 2006年4月 (4)
- 2006年3月 (5)
- 2006年2月 (1)
- 2006年1月 (9)
- 2005年12月 (2)
- 2005年11月 (2)
- 2005年10月 (6)
收藏夾(1)
搜索
積分與排名
- 積分 - 451264
- 排名 - 119
最新評論

- 1.?re: 天行健,君子以自強不息;地勢坤,君子以厚德載物
- 有這麼難嗎,
- --弟弟
- 2.?re: 效率低下
- 真是的,既然不是靜水流深,那就把家底一五一十的報上來
- --簡單的生長
- 3.?re: 天行健,君子以自強不息;地勢坤,君子以厚德載物
- 幼稚,天主動,意為天道,天道運行不息。君子當效天道,錘煉意志,精神。一往無前,以證天道。地為坤,主靜,意指本源。君子當應地勢,取長補短,明心見性,外練體魄,內(nèi)修德行。
- --大號中華
- 4.?re: 天行健,君子以自強不息;地勢坤,君子以厚德載物
-
灌灌灌灌灌灌灌灌灌灌灌灌灌灌灌
@對方的豐富的
- --的幾率
- 5.?re: 樹型Table的設計[未登錄]
- 求一份,xuan0555@126.com
- --ff