posts - 39,  comments - 263,  trackbacks - 0
            2006年5月16日
              這幾天用TimerTask作了個框架,擔心超過十萬條數據的時候速度變慢,其實每秒十萬次的運行速度等到以后放在服務器上運行應該游刃有余吧,還不清楚,不過現在在我筆記本上運行得還可以,內存吃的很大,java就這毛病,程序員不能自由釋放內存。1G內存不夠用,我筆記本2G有分配不了,似乎虛擬內存java用不了,沒仔細做過實驗。
              這幾天看新聞知道番茄花園作者被警方逮捕,樹大招風,槍打出頭鳥,很正常,從程序員的身份來講,盜版是要打擊的,不過我本身電腦里要付費的軟件都是盜版的,很矛盾,呵呵。
          posted @ 2008-08-21 23:54 nake 閱讀(2154) | 評論 (3)編輯 收藏
          實在太久沒寫servlet了,應該至少1年了,那時候做了點皮毛,現在項目要求用到servlet的相關知識,同時我在blogjava的bolg又開張了。學習的過程將記錄在我的blog中。對比了一下netbean和eclipse感覺用netbean編寫servlet程序方便些,eclipse用了幾年,但是還是感覺每次要找好相關的jar需要花費太多時間,于是決定用netbean編寫了。
          posted @ 2008-07-12 15:15 nake 閱讀(1949) | 評論 (2)編輯 收藏
          看看以下代碼:
          將26個英文字母重復加了5000次,

          String tempstr = "abcdefghijklmnopqrstuvwxyz";
          int times = 5000;
          long lstart1=System.currentTimeMillis();
          ??String str ="";
          ??for(int i=0;i<times;i++)
          ??{
          ???str+=tempstr;
          ??}
          ??
          ??long lend1=System.currentTimeMillis();
          ??long time = (lend1-lstart1);
          ??System.out.println(time);

          可惜我的計算機不是超級計算機,得到的結果每次不一定一樣一般為 154735 左右。
          也就是154秒。
          我們再看看以下代碼

          String tempstr = "abcdefghijklmnopqrstuvwxyz";
          ?
          ??int times = 5000;
          long lstart2=System.currentTimeMillis();
          ??StringBuffer sb =new? StringBuffer();
          ??for(int i=0;i<times;i++)
          ??{
          ???sb.append(tempstr);
          ???
          ??}
          ??long lend2=System.currentTimeMillis();
          ??long time2 = (lend2-lstart2);
          ??System.out.println(time2);
          ?得到的結果為 16 有時還是 0
          所以結論很明顯,StringBuffer 的速度幾乎是String 上萬倍。當然這個數據不是很準確。因為循環的次數在100000次的時候,差異更大。不信你試試。
          下一次我將解釋為什么StringBuffer 的效率比String 高這么多。
          posted @ 2007-01-14 12:24 nake 閱讀(4223) | 評論 (4)編輯 收藏

          swt 簡單的托盤程序
          java寫和操作系統相關的程序難度非常大。在java 6出現之前,如果你想實現一個托盤程序,最簡單的就是用swt了。
          通過google我找到了一段代碼。
          其實很簡單。主要的代碼如下:
          ?????????????final Tray tray = display.getSystemTray();
          ??????????? final TrayItem trayItem = new TrayItem(tray, SWT.NONE);
          ??????????? Image image = new Image (display, 16, 16);
          ??????????? trayItem.setImage(image);
          知道了重點,事情變的很簡單了。看看所有程序
          //-----------------
          public class SystemTray extends Shell {
          ??? public static void main(String args[]) {
          ??????? try {
          ??????????? Display display = Display.getDefault();
          ??????????? SystemTray shell = new SystemTray(display, SWT.SHELL_TRIM);
          ?????????? // shell.createSystemTray(shell);
          ??????????? final Tray tray = display.getSystemTray();
          ??????????? final TrayItem trayItem = new TrayItem(tray, SWT.NONE);
          ??????????? Image image = new Image (display, 16, 16);
          ??????????? trayItem.setImage(image);
          ??????????? shell.open();
          ??????????? shell.layout();
          ??????????? while (!shell.isDisposed()) {
          ??????????????? if (!display.readAndDispatch())
          ??????????????????? display.sleep();
          ??????????? }
          ??????? } catch (Exception e) {
          ??????????? e.printStackTrace();
          ??????? }
          ??? }
          ??? public SystemTray(Display display, int style) {
          ??????? super(display, style);
          ??????? createContents();
          ??? }

          ??? /**
          ???? * Create contents of the window
          ???? */
          ??? protected void createContents() {
          ??????? setText("SWT Application");
          ??????? setSize(500, 375);

          ??? }
          ??? //swt 默認情況下不允許shell被繼承
          ??? //所以我重載了父類的方法
          ??? protected void checkSubclass() {
          ???????? }
          }
          //--------------------
          如果你想成功運行以上代碼,你最好在eclipse下新建一個swt的類。具體操作你搜索一下吧。
          但是上面的代碼只是加入了托盤,這可能是最簡單的實現托盤的程序了。我們加入事件處理,讓程序能夠最大和最小化。然后把托盤用圖片來表示。
          詳細的代碼不參考
          下載 到eclipse里運行

          posted @ 2007-01-03 22:58 nake 閱讀(3417) | 評論 (4)編輯 收藏
          從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 閱讀(2289) | 評論 (5)編輯 收藏
          ?

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

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

          案例:項目已經按照客戶確認的調研文檔完成實施工作。客戶的一把手提出新需求。

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

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

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

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

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

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

          posted @ 2006-05-16 17:46 nake 閱讀(3247) | 評論 (2)編輯 收藏
          <2006年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(18)

          我參與的團隊

          隨筆檔案(39)

          收藏夾(1)

          搜索

          •  

          積分與排名

          • 積分 - 451355
          • 排名 - 119

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 枞阳县| 名山县| 深泽县| 乌拉特后旗| 开远市| 宁化县| 东山县| 芜湖市| 汽车| 靖边县| 五指山市| 疏附县| 横峰县| 彭水| 大竹县| 南汇区| 博罗县| 军事| 蛟河市| 井研县| 东乌珠穆沁旗| 白玉县| 襄汾县| 宁阳县| 射洪县| 芷江| 门源| 大洼县| 临江市| 如东县| 广昌县| 东源县| 江永县| 柘城县| 徐汇区| 博客| 徐闻县| 靖安县| 龙井市| 嵊州市| 甘肃省|