小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

對(duì)map集合進(jìn)行排序

 昵稱34978982 2016-08-04


來源:chenssy

鏈接:http://www.cnblogs.com/chenssy/p/3264214.html


今天做統(tǒng)計(jì)時(shí)需要對(duì)X軸的地區(qū)按照地區(qū)代碼(areaCode)進(jìn)行排序,由于在構(gòu)建XMLData使用的map來進(jìn)行數(shù)據(jù)統(tǒng)計(jì)的,所以在統(tǒng)計(jì)過程中就需要對(duì)map進(jìn)行排序。


一、簡(jiǎn)單介紹Map


在講解Map排序之前,我們先來稍微了解下map。map是鍵值對(duì)的集合接口,它的實(shí)現(xiàn)類主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。其中這四者的區(qū)別如下(簡(jiǎn)單介紹):


  • HashMap:我們最常用的Map, 它根據(jù)key的HashCode 值來存儲(chǔ)數(shù)據(jù),根據(jù)key可以直接獲取它的Value,同時(shí)它具有很快的訪問速度。HashMap最多只允許一條記錄的key值為Null(多條會(huì)覆蓋);允許多條記錄的Value為 Null。非同步的。


  • TreeMap: 能夠把它保存的記錄根據(jù)key排序,默認(rèn)是按升序排序,也可以指定排序的比較器,當(dāng)用Iterator 遍歷TreeMap時(shí),得到的記錄是排過序的。TreeMap不允許key的值為null。非同步的。


  • Hashtable: 與 HashMap類似,不同的是:key和value的值均不允許為null;它支持線程的同步,即任一時(shí)刻只有一個(gè)線程能寫Hashtable,因此也導(dǎo)致了Hashtale在寫入時(shí)會(huì)比較慢。


  • LinkedHashMap: 保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時(shí),先得到的記錄肯定是先插入的.在遍歷的時(shí)候會(huì)比HashMap慢。key和value均允許為空,非同步的。


二、Map排序


  • TreeMap


TreeMap默認(rèn)是升序的,如果我們需要改變排序方式,則需要使用比較器:Comparator。


Comparator可以對(duì)集合對(duì)象或者數(shù)組進(jìn)行排序的比較器接口,實(shí)現(xiàn)該接口的public compare(T o1,To2)方法即可實(shí)現(xiàn)排序,該方法主要是根據(jù)第一個(gè)參數(shù)o1,小于、等于或者大于o2分別返回負(fù)整數(shù)、0或者正整數(shù)。如下:


public class TreeMapTest {

    public static void main(String[] args) {

        Map map = new TreeMap(

                new Comparator() {

                    public int compare(String obj1, String obj2) {

                        // 降序排序

                        return obj2.compareTo(obj1);

                    }

                });

        map.put('c', 'ccccc');

        map.put('a', 'aaaaa');

        map.put('b', 'bbbbb');

        map.put('d', 'ddddd');

 

        Set keySet = map.keySet();

        Iterator iter = keySet.iterator();

        while (iter.hasNext()) {

            String key = iter.next();

            System.out.println(key + ':' + map.get(key));

        }

    }

}

      運(yùn)行結(jié)果如下:


      d:ddddd

c:ccccc

b:bbbbb

a:aaaaa


上面例子是對(duì)根據(jù)TreeMap的key值來進(jìn)行排序的,但是有時(shí)我們需要根據(jù)TreeMap的value來進(jìn)行排序。對(duì)value排序我們就需要借助于Collections的sort(List list, Comparator c)方法,該方法根據(jù)指定比較器產(chǎn)生的順序?qū)χ付斜磉M(jìn)行排序。但是有一個(gè)前提條件,那就是所有的元素都必須能夠根據(jù)所提供的比較器來進(jìn)行比較。如下:


public class TreeMapTest {

    public static void main(String[] args) {

        Map map = new TreeMap();

        map.put('d', 'ddddd');

        map.put('b', 'bbbbb');

        map.put('a', 'aaaaa');

        map.put('c', 'ccccc');

 

        //這里將map.entrySet()轉(zhuǎn)換成list

        List> list = new ArrayList>(map.entrySet());

        //然后通過比較器來實(shí)現(xiàn)排序

        Collections.sort(list,new Comparator>() {

            //升序排序

            public int compare(Entry o1,

                    Entry o2) {

                return o1.getValue().compareTo(o2.getValue());

            }

 

        });

 

        for(Map.Entry mapping:list){ 

               System.out.println(mapping.getKey()+':'+mapping.getValue()); 

          } 

    }

}

      運(yùn)行結(jié)果


      a:aaaaa

b:bbbbb

c:ccccc

d:ddddd


  • HashMap


我們都是HashMap的值是沒有順序的,他是按照key的HashCode來實(shí)現(xiàn)的。對(duì)于這個(gè)無序的HashMap我們要怎么來實(shí)現(xiàn)排序呢?參照TreeMap的value排序,我們一樣的也可以實(shí)現(xiàn)HashMap的排序。


public class HashMapTest {

    public static void main(String[] args) {

        Map map = new HashMap();

        map.put('c', 'ccccc');

        map.put('a', 'aaaaa');

        map.put('b', 'bbbbb');

        map.put('d', 'ddddd');

 

        List> list = new ArrayList>(map.entrySet());

        Collections.sort(list,new Comparator>() {

            //升序排序

            public int compare(Entry o1,

                    Entry o2) {

                return o1.getValue().compareTo(o2.getValue());

            }

 

        });

 

        for(Map.Entry mapping:list){ 

               System.out.println(mapping.getKey()+':'+mapping.getValue()); 

          } 

     }

}

      運(yùn)行結(jié)果


      a:aaaaa

b:bbbbb

c:ccccc

d:ddddd


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多