lidwup

          2009年8月14日 #

          用戶是一個(gè)絕頂聰明的傻子(轉(zhuǎn),向原創(chuàng)致敬)

           
          從用戶能夠感受得到的角度進(jìn)行分析(做用戶體驗(yàn)的原則:堅(jiān)決做用戶感受得到,絕不做用戶感受不到的——控制成本的有效辦法),把用戶體驗(yàn)劃分為四步(用戶體驗(yàn)四步曲):

          第一步視覺(jué)體驗(yàn)。

          視覺(jué)體驗(yàn)是用戶對(duì)界面設(shè)計(jì)的第一感官體驗(yàn)。它是完全是用戶幾乎沒(méi)有經(jīng)過(guò)思考前的一種視覺(jué)感受,如何給用戶提供一種近于完美的視覺(jué)體驗(yàn),需要考慮到用戶看到界面時(shí)可能出現(xiàn)的任何一種感受,這就提出UI設(shè)計(jì)師需要對(duì)目標(biāo)用戶偏愛(ài)的準(zhǔn)確了解和把握,精確傳達(dá)需要傳達(dá)的含義,才會(huì)獲得預(yù)期的效果;視覺(jué)體驗(yàn)直接影響到用戶是否停留在此頁(yè)面進(jìn)行一下步的表達(dá)理解。注意:任何一種讓用戶感官視覺(jué)不適的界面都可能導(dǎo)致用戶產(chǎn)生怨言和流失。

          第二步表達(dá)體驗(yàn)。

          表達(dá)體驗(yàn)是用戶在視覺(jué)體驗(yàn)的基礎(chǔ)上對(duì)界面內(nèi)容的理解,界面內(nèi)容可能是文字,也可能是圖案,這些內(nèi)容是引導(dǎo)用戶進(jìn)行操作的“提示或說(shuō)明”,是需要用戶進(jìn)行理解的內(nèi)容,如何給用戶提供一種簡(jiǎn)單直白有趣易懂的表達(dá)體驗(yàn),需要產(chǎn)品設(shè)計(jì)人員考慮到用戶對(duì)需要理解的內(nèi)容可能出現(xiàn)的任何一種理解進(jìn)行預(yù)估,消除一些傳達(dá)出錯(cuò)誤信息的內(nèi)容,因?yàn)檫@些內(nèi)容都是單向的表達(dá),沒(méi)有解釋和補(bǔ)充的機(jī)會(huì)來(lái)糾正用戶瞬間的理解;表達(dá)體驗(yàn)直接影響到用戶下一步的操作行為是否合理。注意:任何一種讓用戶產(chǎn)生誤解的表達(dá)都可能導(dǎo)致用戶產(chǎn)生怨言和流失。

          第三步操作體驗(yàn)。

          操作體驗(yàn)是用戶通過(guò)對(duì)表達(dá)內(nèi)容的理解后做出的行為動(dòng)作的體驗(yàn)過(guò)程。功能邏輯是操作體驗(yàn)的直接影響因素,如何優(yōu)化用戶的操作過(guò)程是產(chǎn)品設(shè)計(jì)人員需要思考的核心問(wèn)題之一,既需要考慮正常的邏輯,又需要考慮非正常的邏輯形式,盡可能考慮到用戶可能出現(xiàn)的任何一種行為方式,才能保證用戶進(jìn)行正確的愉悅的操作過(guò)程;操作體驗(yàn)直接影響到用戶下一步的內(nèi)容體驗(yàn)。注意:任何一種繁瑣和復(fù)雜的操作邏輯都可能導(dǎo)致用戶產(chǎn)生怨言和流失。

          第四步結(jié)果體驗(yàn)。

          結(jié)果體驗(yàn)是用戶通過(guò)操作行為獲得的行為結(jié)果的一種體驗(yàn)過(guò)程。用戶的任何一種操作可能出現(xiàn)的任何一個(gè)行為結(jié)果都直接影響到用戶結(jié)果體驗(yàn)。如果通過(guò)用戶的任何行為來(lái)預(yù)估用戶的準(zhǔn)確需求是產(chǎn)品設(shè)計(jì)人員需要思考的核心問(wèn)題之一,這就要求涉及好每一種用戶行為可能出現(xiàn)的任何一種結(jié)果,并預(yù)測(cè)每一種結(jié)果是否能夠滿足用戶的需求,如果不能,如何采用其他方式來(lái)滿足用戶的行為需求。注意:任何一種不能滿足用戶需求的操作結(jié)果都可能導(dǎo)致用戶產(chǎn)生怨言和流失。

          總結(jié):用戶是絕頂聰明的天才,因?yàn)樗赡馨l(fā)現(xiàn)任何一個(gè)細(xì)微的不足;用戶是傻子,因?yàn)槿魏我粋€(gè)微不足道的細(xì)節(jié)失誤都可能導(dǎo)致用戶出現(xiàn)挫敗感;每一個(gè)細(xì)節(jié)看起來(lái)都微不足道,但是每一個(gè)細(xì)節(jié)的綜合就會(huì)促使整個(gè)產(chǎn)品趨于完美,也許用戶只是感動(dòng)于某個(gè)細(xì)節(jié),但他接受你一定是認(rèn)同你的全部!

          posted @ 2009-08-14 10:53 我愛(ài)咖啡 閱讀(80) | 評(píng)論 (0)編輯 收藏

          2009年7月30日 #

          用Windows內(nèi)置功能輕松查看端口使用情況 (轉(zhuǎn))

          用Windows內(nèi)置功能輕松查看端口使用情況   [閱讀: 564]

          在局域網(wǎng)使用中,我們常常會(huì)發(fā)現(xiàn)系統(tǒng)中開放了一些莫名其妙的端口,這就給系統(tǒng)的安全帶來(lái)了一些隱患。為了讓端口的使用盡在掌握之中,一些朋友就會(huì)使用第三方工具來(lái)進(jìn)行檢查出使用端口的特定程序究竟是誰(shuí),但實(shí)際上我們完全不必這樣興師動(dòng)眾,因?yàn)閃indows已經(jīng)內(nèi)置了這個(gè)功能,下面讓我們來(lái)學(xué)習(xí)一下吧!
            查看端口開放情況
           稍有經(jīng)驗(yàn)的網(wǎng)管就會(huì)知道使用Netstat命令可以查看系統(tǒng)當(dāng)前開放的端口有哪些,但你知道嗎?如果在使用Netstat命令的同時(shí)加上參數(shù)“-o”的話,就可以讓我們進(jìn)一步知曉端口的關(guān)聯(lián)進(jìn)程標(biāo)識(shí)符 (PID)了,也就是說(shuō)這個(gè)PID可用來(lái)確定哪個(gè)進(jìn)程(程序)在使用特定的端口。例如,現(xiàn)在使用“netstat-ano”命令后可以發(fā)現(xiàn)端口3026、 3030、3728在開放(如圖1所示)。
            從上圖中并不能直接看出這三個(gè)端口的關(guān)聯(lián)進(jìn)程是誰(shuí),但我們卻可以通過(guò)PID信息知道是628這個(gè)進(jìn)程在使用這三個(gè)端口。

          1 查看端口
            激活進(jìn)程PID
           既然知道系統(tǒng)中有個(gè)PID為628的進(jìn)程,那么就來(lái)看看它究竟是誰(shuí)。大家都知道,查看系統(tǒng)進(jìn)程可以使用同時(shí)按“Ctrl+Alt+Delete”組合鍵的方法,在打開的“Windows任務(wù)管理器”的“進(jìn)程”選項(xiàng)卡中進(jìn)行。但默認(rèn)狀態(tài)下,“進(jìn)程”選項(xiàng)卡中是沒(méi)有PID這一項(xiàng)存在的,這樣我們就無(wú)法知道進(jìn)程相對(duì)應(yīng)的PID是什么了。因此,要首先激活進(jìn)程對(duì)應(yīng)的PID項(xiàng)顯示狀態(tài)才行。方法如下:
            單擊“Windows任務(wù)管理器”窗口中“查看”下的“選擇列”菜單項(xiàng),然后單擊選中“PID”(進(jìn)程標(biāo)識(shí)符)復(fù)選框(如圖2所示)。
          2 選擇進(jìn)程PID
            稍后在“Windows任務(wù)管理器”窗口“進(jìn)程”選項(xiàng)卡的列表中就會(huì)發(fā)現(xiàn)多出了PID這一項(xiàng),接下來(lái)只需按從大到小的順序查找到PID為628的進(jìn)程后,就可以發(fā)現(xiàn)“幕后程序”究竟是誰(shuí)了(如圖3所示)。

          3 Windows任務(wù)管理器
            通過(guò)上圖中顯示信息可以發(fā)現(xiàn),原來(lái)使用端口3026、3030、3728的關(guān)聯(lián)PID是628,而使用PID為628的應(yīng)用程序是“MSN Messenger”!!瞧,我們已經(jīng)輕易地為端口找到的“另一半”了!

          posted @ 2009-07-30 11:06 我愛(ài)咖啡 閱讀(160) | 評(píng)論 (0)編輯 收藏

          2009年7月23日 #

          【轉(zhuǎn)】淺談Hibernate的flush機(jī)制

          隨著Hibernate在Java開發(fā)中的廣泛應(yīng)用,我們?cè)谑褂肏ibernate進(jìn)行對(duì)象持久化操作中也遇到了各種各樣的問(wèn)題。這些問(wèn)題往往都是我們對(duì)Hibernate缺乏了解所致,這里我講個(gè)我從前遇到的問(wèn)題及一些想法,希望能給大家一點(diǎn)借鑒。

                  這是在一次事務(wù)提交時(shí)遇到的異常。
                  an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
          net.sf.hibernate.AssertionFailure: possible nonthreadsafe access to session
          注:非possible non-threadsafe access to the session (那是另外的錯(cuò)誤,類似但不一樣)

                  這個(gè)異常應(yīng)該很多的朋友都遇到過(guò),原因可能各不相同。但所有的異常都應(yīng)該是在flush或者事務(wù)提交的過(guò)程中發(fā)生的。這一般由我們?cè)谑聞?wù)開始至事務(wù)提交的過(guò)程中進(jìn)行了不正確的操作導(dǎo)致,也會(huì)在多線程同時(shí)操作一個(gè)Session時(shí)發(fā)生,這里我們僅僅討論單線程的情況,多線程除了線程同步外基本與此相同。

                  至于具體是什么樣的錯(cuò)誤操作那?我給大家看一個(gè)例子(假設(shè)Hibernate配置正確,為保持代碼簡(jiǎn)潔,不引入包及處理任何異常)
            

          SessionFactory sf = new Configuration().configure().buildSessionFactory() ;
          Session s = sf.openSession();
          Cat cat = new Cat();

          Transaction tran = s.beginTransaction(); (1)
          s.save(cat); (2)(此處同樣可以為update delete)
          s.evict(cat); (3)
          tran.commit(); (4)
          s.close();(5)


                  這就是引起此異常的典型錯(cuò)誤。我當(dāng)時(shí)就遇到了這個(gè)異常,檢查代碼時(shí)根本沒(méi)感覺(jué)到這段代碼出了問(wèn)題,想當(dāng)然的認(rèn)為在Session上開始一個(gè)事務(wù),通過(guò)Session將對(duì)象存入數(shù)據(jù)庫(kù),再將這個(gè)對(duì)象從Session上拆離,提交事務(wù),這是一個(gè)很正常的流程。如果這里正常的話,那問(wèn)題一定在別處。

                   問(wèn)題恰恰就在這里,我的想法也許沒(méi)有錯(cuò),但是一個(gè)錯(cuò)誤的論據(jù)所引出的觀點(diǎn)永遠(yuǎn)都不可能是正確的。因?yàn)槲乙恢币詾橹苯釉趯?duì)數(shù)據(jù)庫(kù)進(jìn)行操作,忘記了在我與數(shù)據(jù)庫(kù)之間隔了一個(gè)Hibernate,Hibernate在為我們提供持久化服務(wù)的同時(shí),也改變了我們對(duì)數(shù)據(jù)庫(kù)的操作方式,這種方式與我們直接的數(shù)據(jù)庫(kù)操作有著很多的不同,正因?yàn)槲覀儗?duì)這種方式?jīng)]有一個(gè)大致的了解造成了我們的應(yīng)用并未得到預(yù)先設(shè)想的結(jié)果。

          那Hibernate的持久化機(jī)制到底有什么不同那?簡(jiǎn)單的說(shuō),Hibernate在數(shù)據(jù)庫(kù)層之上實(shí)現(xiàn)了一個(gè)緩存區(qū),當(dāng)應(yīng)用save或者update一個(gè)對(duì)象時(shí),Hibernate并未將這個(gè)對(duì)象實(shí)際的寫入數(shù)據(jù)庫(kù)中,而僅僅是在緩存中根據(jù)應(yīng)用的行為做了登記,在真正需要將緩存中的數(shù)據(jù)flush入數(shù)據(jù)庫(kù)時(shí)才執(zhí)行先前登記的所有行為。

          在實(shí)際執(zhí)行的過(guò)程中,每個(gè)Session是通過(guò)幾個(gè)映射和集合來(lái)維護(hù)所有與該Session建立了關(guān)聯(lián)的對(duì)象以及應(yīng)用對(duì)這些對(duì)象所進(jìn)行的操作的,與我們這次討論有關(guān)的有entityEntries(與Session相關(guān)聯(lián)的對(duì)象的映射)、insertions(所有的插入操作集合)、deletions(刪除操作集合)、updates(更新操作集合)。下面我就開始解釋在最開始的例子中,Hibernate到底是怎樣運(yùn)作的。
          (1)生成一個(gè)事務(wù)的對(duì)象,并標(biāo)記當(dāng)前的Session處于事務(wù)狀態(tài)(注:此時(shí)并未啟動(dòng)數(shù)據(jù)庫(kù)級(jí)事務(wù))。
          (2)應(yīng)用使用s.save保存cat對(duì)象,這個(gè)時(shí)候Session將cat這個(gè)對(duì)象放入entityEntries,用來(lái)標(biāo)記cat已經(jīng)和當(dāng)前的會(huì)話建立了關(guān)聯(lián),由于應(yīng)用對(duì)cat做了保存的操作,Session還要在insertions中登記應(yīng)用的這個(gè)插入行為(行為包括:對(duì)象引用、對(duì)象id、Session、持久化處理類)。
          (3)s.evict(cat)將cat對(duì)象從s會(huì)話中拆離,這時(shí)s會(huì)從entityEntries中將cat這個(gè)對(duì)象移出。
          (4)事務(wù)提交,需要將所有緩存flush入數(shù)據(jù)庫(kù),Session啟動(dòng)一個(gè)事務(wù),并按照insert,update,……,delete的順序提交所有之前登記的操作(注意:所有insert執(zhí)行完畢后才會(huì)執(zhí)行update,這里的特殊處理也可能會(huì)將你的程序搞得一團(tuán)糟,如需要控制操作的執(zhí)行順序,要善于使用flush),現(xiàn)在cat不在entityEntries中,但在執(zhí)行insert的行為時(shí)只需要訪問(wèn)insertions就足夠了,所以此時(shí)不會(huì)有任何的異常。異常出現(xiàn)在插入后通知Session該對(duì)象已經(jīng)插入完畢這個(gè)步驟上,這個(gè)步驟中需要將entityEntries中cat的existsInDatabase標(biāo)志置為true,由于cat并不存在于entityEntries中,此時(shí)Hibernate就認(rèn)為insertions和entityEntries可能因?yàn)榫€程安全的問(wèn)題產(chǎn)生了不同步(也不知道Hibernate的開發(fā)者是否考慮到例子中的處理方式,如果沒(méi)有的話,這也許算是一個(gè)bug吧),于是一個(gè)net.sf.hibernate.AssertionFailure就被拋出,程序終止。

          我想現(xiàn)在大家應(yīng)該明白例子中的程序到底哪里有問(wèn)題了吧,我們的錯(cuò)誤的認(rèn)為s.save會(huì)立即的執(zhí)行,而將cat對(duì)象過(guò)早的與Session拆離,造成了Session的insertions和entityEntries中內(nèi)容的不同步。所以我們?cè)谧龃祟惒僮鲿r(shí)一定要清楚Hibernate什么時(shí)候會(huì)將數(shù)據(jù)flush入數(shù)據(jù)庫(kù),在未flush之前不要將已進(jìn)行操作的對(duì)象從Session上拆離。

          對(duì)于這個(gè)錯(cuò)誤的解決方法是,我們可以在(2)和(3)之間插入一個(gè)s.flush()強(qiáng)制Session將緩存中的數(shù)據(jù)flush入數(shù)據(jù)庫(kù)(此時(shí)Hibernate會(huì)提前啟動(dòng)事務(wù),將(2)中的save登記的insert語(yǔ)句登記在數(shù)據(jù)庫(kù)事務(wù)中,并將所有操作集合清空),這樣在(4)事務(wù)提交時(shí)insertions集合就已經(jīng)是空的了,即使我們拆離了cat也不會(huì)有任何的異常了。
          前面簡(jiǎn)單的介紹了一下Hibernate的flush機(jī)制和對(duì)我們程序可能帶來(lái)的影響以及相應(yīng)的解決方法,Hibernate的緩存機(jī)制還會(huì)在其他的方面給我們的程序帶來(lái)一些意想不到的影響。看下面的例子:
            

          (name為cat表的主鍵)
          Cat cat = new Cat();
          cat.setName(“tom”);
          s.save(cat);

          cat.setName(“mary”);
          s.update(cat);(6)

          Cat littleCat = new Cat();
          littleCat.setName(“tom”);
          s.save(littleCat);

          s.flush();


          這個(gè)例子看起來(lái)有什么問(wèn)題?估計(jì)不了解Hibernate緩存機(jī)制的人多半會(huì)說(shuō)沒(méi)有問(wèn)題,但它也一樣不能按照我們的思路正常運(yùn)行,在flush過(guò)程中會(huì)產(chǎn)生主鍵沖突,可能你想問(wèn):“在save(littleCat)之前不是已經(jīng)更改cat.name并已經(jīng)更新了么?為什么還會(huì)發(fā)生主鍵沖突那?”這里的原因就是我在解釋第一個(gè)例子時(shí)所提到的緩存flush順序的問(wèn)題,Hibernate按照insert,update,……,delete的順序提交所有登記的操作,所以你的s.update(cat)雖然在程序中出現(xiàn)在s.save(littleCat)之前,但是在flush的過(guò)程中,所有的save都將在update之前執(zhí)行,這就造成了主鍵沖突的發(fā)生。

          這個(gè)例子中的更改方法一樣是在(6)之后加入s.flush()強(qiáng)制Session在保存littleCat之前更新cat的name。這樣在第二次flush時(shí)就只會(huì)執(zhí)行s.save(littleCat)這次登記的動(dòng)作,這樣就不會(huì)出現(xiàn)主鍵沖突的狀況。

          再看一個(gè)例子(很奇怪的例子,但是能夠說(shuō)明問(wèn)題)

          Cat cat = new Cat();
          cat.setName(“tom”);
          s.save(cat); (7)
          s.delete(cat);(8)

          cat.id=null;(9)
          s.save(cat);(10)
          s.flush();


          這個(gè)例子在運(yùn)行時(shí)會(huì)產(chǎn)生異常net.sf.hibernate.HibernateException: identifier of an instance of Cat altered from 8b818e920a86f038010a86f03a9d0001 to null

          這里例子也是有關(guān)于緩存的問(wèn)題,但是原因稍有不同:
          (7)和(2)的處理相同。
          (8)Session會(huì)在deletions中登記這個(gè)刪除動(dòng)作,同時(shí)更新entityEntries中該對(duì)象的登記狀態(tài)為DELETED。
          (9)Cat類的標(biāo)識(shí)符字段為id,將其置為null便于重新分配id并保存進(jìn)數(shù)據(jù)庫(kù)。
          (10)此時(shí)Session會(huì)首先在entityEntries查找cat對(duì)象是否曾經(jīng)與Session做過(guò)關(guān)聯(lián),因?yàn)閏at只改變了屬性值,引用并未改變,所以會(huì)取得狀態(tài)為DELETED的那個(gè)登記對(duì)象。由于第二次保存的對(duì)象已經(jīng)在當(dāng)前Session中刪除,save會(huì)強(qiáng)制Session將緩存flush才會(huì)繼續(xù),flush的過(guò)程中首先要執(zhí)行最開始的save動(dòng)作,在這個(gè)save中檢查了cat這個(gè)對(duì)象的id是否與原來(lái)執(zhí)行動(dòng)作時(shí)的id相同。不幸的是,此時(shí)cat的id被賦為null,異常被拋出,程序終止(此處要注意,我們?cè)谝院蟮拈_發(fā)過(guò)程盡量不要在flush之前改變已經(jīng)進(jìn)行了操作的對(duì)象的id)。

          這個(gè)例子中的錯(cuò)誤也是由于緩存的延時(shí)更新造成的(當(dāng)然,與不正規(guī)的使用Hibernate也有關(guān)系),處理方法有兩種:
          1、在(8)之后flush,這樣就可以保證(10)處save將cat作為一個(gè)全新的對(duì)象進(jìn)行保存。
          2、刪除(9),這樣第二次save所引起的強(qiáng)制flush可以正常的執(zhí)行,在數(shù)據(jù)庫(kù)中插入cat對(duì)象后將其刪除,然后繼續(xù)第二次save重新插入cat對(duì)象,此時(shí)cat的id仍與從前一致。

          這兩種方法可以根據(jù)不同的需要來(lái)使用,呵呵,總覺(jué)得好像是很不正規(guī)的方式來(lái)解決問(wèn)題,但是問(wèn)題本身也不夠正規(guī),只希望能夠在應(yīng)用開發(fā)中給大家一些幫助,不對(duì)的地方也希望各位給與指正。

            總的來(lái)說(shuō),由于Hibernate的flush處理機(jī)制,我們?cè)谝恍?fù)雜的對(duì)象更新和保存的過(guò)程中就要考慮數(shù)據(jù)庫(kù)操作順序的改變以及延時(shí)flush是否對(duì)程序的結(jié)果有影響。如果確實(shí)存在著影響,那就可以在需要保持這種操作順序的位置加入flush強(qiáng)制Hibernate將緩存中記錄的操作flush入數(shù)據(jù)庫(kù),這樣看起來(lái)也許不太美觀,但很有效。

          posted @ 2009-07-23 17:41 我愛(ài)咖啡 閱讀(110) | 評(píng)論 (0)編輯 收藏

          2009年7月1日 #

          java中的排序1:comparable和comparator(轉(zhuǎn))

          分三種情況:

          簡(jiǎn)單類型排序。

          內(nèi)部對(duì)象實(shí)現(xiàn)comparable

          外部對(duì)象實(shí)現(xiàn)comparator

          1、簡(jiǎn)單類型的排序

          簡(jiǎn)單類型不外是byte, char, short, int, long, float, double等數(shù)據(jù)類型,這些類型不能放在聚集中,只能使用數(shù)組。java.util.Arrays方法提供了對(duì)這些類型的sort方法(實(shí)際上還有很多其他有用的方法),下面是對(duì)一個(gè)簡(jiǎn)單的int數(shù)組排序:

                      int[] arr = {2, 3, 1,10,7,4};

                        System.out.print("before sort: ");

                        for (int i = 0; i< arr.length; i++)

                               System.out.print(arr[i] + " ");

                        System.out.println();            

                        Arrays.sort(arr);

                        System.out.print("after sort: ");

                        for (int i = 0; i< arr.length; i++)

                               System.out.print(arr[i] + " ");

                        System.out.println();      

          輸出結(jié)果:

          before sort: 2 3 1 10 7 4

          after sort: 1 2 3 4 7 10

          我們看到排序結(jié)果是按照升序排列的,下面的排序都是如此。

          Comparable & Comparator 都是用來(lái)實(shí)現(xiàn)集合中的排序的,只是Comparable是在集合內(nèi)部定義的方法實(shí)現(xiàn)的排序,Comparator是在集合外部實(shí)現(xiàn)的排序,所以,如想實(shí)現(xiàn)排序,就需要在集合外定義Comparator接口的方法或在集合內(nèi)實(shí)現(xiàn)Comparable接口的方法。

          2、內(nèi)部對(duì)象實(shí)現(xiàn)comparable

          案例:

          class Programmer implements Comparable{

                 private String name;

                 private String language;

                 private double pay;

                

                 public Programmer(String name, String language, double pay) {

                        this.name = name;

                        this.language = language;

                        this.pay = pay;

                 }

                 public int compareTo(Object o) {

                        Programmer other = (Programmer)o;

                        return (int)pay - (int)other.pay;

                 }

                 public String toString(){

                        return "{name: " + name + ", language: " + language + ", money: " + pay + "}";

                 }

          }

          對(duì)其進(jìn)行排序:

                        ArrayList list = new ArrayList();

                        list.add(new Programmer("張三", "C", 12000));

                        list.add(new Programmer("李四", "Java", 200));

                        list.add(new Programmer("王五", "C++", 5000));

                        list.add(new Programmer("錢六", "VB", 3000));

                        System.out.println("before sort: " + list);

                        Collections.sort(list);

                        System.out.println("after sort: " + list);

          3、外部對(duì)象實(shí)現(xiàn)comparator

          案例:

          import java.util.Arrays;
          import java.util.Comparator;

          public class SampleComparator implements Comparator {

             public int compare(Object o1, Object o2) {
               return toInt(o1) - toInt(o2);
             }

             private int toInt(Object o) {
               String str = (String) o;
               str = str.replaceAll("一
          ", "1");
               str = str.replaceAll("二
          ", "2");
               str = str.replaceAll("三
          ", "3");
               //
               return Integer.parseInt(str);
             }

             /**
              *
          測(cè)試方法
              */
             public static void main(String[] args) {
               String[] array = new String[] { "
          一二", "三", "" };
               Arrays.sort(array, new SampleComparator());
               for (int i = 0; i < array.length; i++) {
                 System.out.println(array[i]);
               }
             }

          posted @ 2009-07-01 15:30 我愛(ài)咖啡 閱讀(290) | 評(píng)論 (0)編輯 收藏

          2009年5月25日 #

          oracle 支持的遞歸查詢語(yǔ)句

          oracle支持的遞歸查詢語(yǔ)句:Connect By Prior

          如:select * from module where parentid>-1  Start With ID =621 Connect By Prior ID = ParentId

          posted @ 2009-05-25 02:12 我愛(ài)咖啡| 編輯 收藏

          僅列出標(biāo)題  
          主站蜘蛛池模板: 雅安市| 松桃| 勐海县| 青龙| 乡城县| 宜昌市| 邳州市| 宝兴县| 新邵县| 榆林市| 彭水| 饶河县| 会泽县| 定日县| 石家庄市| 宜阳县| 上犹县| 海城市| 玉田县| 黄大仙区| 阿尔山市| 昌吉市| 靖江市| 城步| 聂拉木县| 和顺县| 当雄县| 洛南县| 禹城市| 香格里拉县| 芦溪县| 大兴区| 惠东县| 新疆| 九龙坡区| 五常市| 芦溪县| 响水县| 修水县| 遂川县| 海阳市|