<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
     最近工作遇到需要按一個(gè)model中不同的列進(jìn)行排序的問(wèn)題,查了一下JDK API文檔,發(fā)現(xiàn),java中可以排序的工具類和接口共有五個(gè)SortedMap 、SortedSet、TreeMap 、TreeSet和Collections,由于我要排序的是一系列model,所以,最后使用了TreeMap對(duì)象,而且TreeMap到最后的處理比較自由,可以直接返回TreeMap對(duì)象,也可以返回model的一個(gè)Collection對(duì)象。其它幾個(gè)類的用法其實(shí)都是大同小異,如果java基礎(chǔ)較好,看一下API文檔很容易明白,只是Collection中需要顯式調(diào)用sort()方法而已。

       寫理論的東西或者深入的東西就會(huì)太多了,而且讓人會(huì)看得比較煩,這里講求實(shí)用,就不多說(shuō)了,直接入正體,基本的排序代碼如下:
      package ChineseSort;

    import java.util.Collection;

    import java.util.Iterator;

    import java.util.SortedMap;

    import java.util.TreeMap;

    public class TestSort {

    public static void main(String[] args) {

        // TODO Auto-generated method stub    

        TreeMap map = new TreeMap();      

        for(int i=0; i<10; i++) {

            String  s = ""+(int)(Math.random()*1000);

            map.put(s,s);

        }

        map.put("abcd","abcd");

        map.put("Abc", "Abc");

        map.put("bbb","bbb");

        map.put("BBBB", "BBBB");

        map.put("北京","北京");

        map.put("中國(guó)","中國(guó)");

        map.put("上海", "上海");

        map.put("廈門", "廈門");

        map.put("香港", "香港");

        map.put("碑海", "碑海");

        Collection col = map.values();

        Iterator it = col.iterator();

        while(it.hasNext()) {

            System.out.println(it.next());

        }

    }

    }

       代碼就不多作解釋了,一看就明白,開始放進(jìn)去10個(gè)整數(shù)隨機(jī)數(shù),然后是英文,然后是中文。運(yùn)行結(jié)果如下:

    132

    205

    287

    295

    399

    410

    411

    464

    670

    73

    Abc

    BBBB

    abcd

    bbb

    上海

    中國(guó)

    北京

    廈門

    碑海

    香港

        注意,這里的數(shù)字排序正常,而英文排序是區(qū)分大小寫的,這個(gè)也是正常的,因?yàn)锳SCII碼中小寫字母比大寫字母靠后,中文排序則明顯的不正確,碑和北明顯應(yīng)該在一起的,而且應(yīng)該在最前面。這個(gè)主要是java中使用中文編碼GB2312或者JBK時(shí),char型轉(zhuǎn)換成int型得過(guò)程出現(xiàn)了比較大的偏差,很多文章介紹過(guò)了,大家可以去網(wǎng)上找一下,這里不多說(shuō)了,直接尋找解決方案。

       Java中之所以出現(xiàn)偏差,主要是compare方法的問(wèn)題,所以這里自己實(shí)現(xiàn)Comparator接口,而國(guó)際化的問(wèn)題,使用Collator類來(lái)解決。這里先解決中文問(wèn)題,代碼如下:

    package ChineseSort;

    import java.text.CollationKey;

    import java.text.Collator;

    import java.util.Comparator;

    public class CollatorComparator implements Comparator {

    Collator collator = Collator.getInstance();

    public int compare(Object element1, Object element2) {

        CollationKey key1 = collator.getCollationKey(element1.toString());

        CollationKey key2 = collator.getCollationKey(element2.toString());

        return key1.compareTo(key2);

    }

    }

        同時(shí)修改我們前面完成的TestSort類,找到TreeMap map = new TreeMap();

        修改為

        CollatorComparator comparator = new CollatorComparator();

        TreeMap map = new TreeMap();

        再次運(yùn)行該類,運(yùn)行結(jié)果如下:

    325

    62

    653

    72

    730

    757

    874

    895

    909

    921

    Abc

    abcd

    bbb

    BBBB

    碑海

    北京

    上海

    廈門

    香港

    中國(guó)

       此時(shí)可以看到中文的排序已經(jīng)完成正常。如果想不讓英文區(qū)分大小寫,則修改CollatorComparator類,找到

        element1.toString()

        修改為:

        element1.toString().toLowerCase()

        當(dāng)然你改成轉(zhuǎn)換成大寫的也無(wú)所謂了,當(dāng)然element2.toString()也要同時(shí)修改為element2.toString().toLowerCase()。再次運(yùn)行結(jié)果如下:

    207

    353

    656

    659

    770

    789

    857

    861

    931

    984

    Abc

    abcd

    bbb

    BBBB

    碑海

    北京

    上海

    廈門

    香港

    中國(guó)

        現(xiàn)在可以看到,排序已經(jīng)完全符合我們的要求了。如果要反向排序也很容易,遍歷的時(shí)候倒過(guò)來(lái),或者你寫兩個(gè)Comparator的實(shí)現(xiàn)類,正向的排序就像我們前面所寫的,反向排序就將return key1.compareTo(key2);修改成return -key1.compareTo(key2);,加了個(gè)負(fù)號(hào),這里你可以直接加個(gè)符號(hào)看看效果,結(jié)果我就不寫了,肯定中國(guó)是Number One。我還真沒(méi)找到TreeMap里直接反向的方法,誰(shuí)看到了告訴我。

        最后一些要說(shuō)明的,這里我就不再寫實(shí)現(xiàn)的代碼了,就是我們要實(shí)現(xiàn)的是根據(jù)model中的一個(gè)列進(jìn)行排序,而我們測(cè)試代碼只是簡(jiǎn)單的一些值,這個(gè)容易,遍歷所有model,把要排序的列值取出來(lái)作為TreeMap的key,然后model放進(jìn)去作為value就行了,這個(gè)很簡(jiǎn)單,如果想寫成稍微通用點(diǎn)的,就使用反射機(jī)制,把取值方法封裝一下就行了,然后把model對(duì)象和方法名扔進(jìn)去就行了。至于value值重復(fù)的問(wèn)題,也好辦,只要value相同只要不是多列同時(shí)作為排序的鍵,那么他們之間的前后順序無(wú)所謂,判斷一下當(dāng)前Map中是否含有該key值,存在,則新的key做成value+longtime就行了,就是加個(gè)時(shí)間戳(感覺(jué)用時(shí)間戳比較方便,其它的能區(qū)分的辦法也行啦)。至于多列的排序,其實(shí)也容易,按照列的前后順序firstvalue+secondvalue+......組成key放到TreeMap里照樣OK J 方便吧。

    主站蜘蛛池模板: 日本特黄特色免费大片| 亚洲日本va午夜中文字幕一区| 亚洲一区二区三区在线网站| 4虎1515hh永久免费| 亚洲网站视频在线观看| 亚洲免费视频观看| 亚洲剧场午夜在线观看| 久久天天躁狠狠躁夜夜免费观看| 亚洲精品中文字幕无乱码麻豆| 成人免费视频77777| 亚洲国产精品成人综合色在线| 日韩激情淫片免费看| 老湿机一区午夜精品免费福利 | 亚洲国产av高清无码| 亚洲人成在线免费观看| 国产午夜亚洲精品| 亚洲成人一区二区| 中文在线观看免费网站| 亚洲精品一区二区三区四区乱码 | 黄色永久免费网站| 亚洲乱码在线卡一卡二卡新区| 高清国语自产拍免费视频国产 | 免费观看亚洲人成网站| 国产亚洲精品成人AA片新蒲金| 华人在线精品免费观看| 亚洲一级毛片视频| 亚洲AV日韩精品一区二区三区| 三级网站在线免费观看| 亚洲国产精品乱码在线观看97| 国产嫩草影院精品免费网址| 国产精品小视频免费无限app| 亚洲美女一区二区三区| 国产小视频在线观看免费| 国产日韩AV免费无码一区二区 | 小日子的在线观看免费| 亚洲 欧洲 视频 伦小说| 亚洲熟伦熟女新五十路熟妇| 日韩精品极品视频在线观看免费| 亚洲精品精华液一区二区| 亚洲成av人片在线观看无码不卡| 皇色在线视频免费网站|