瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          MAP排序 (轉(zhuǎn))

          Posted on 2011-08-23 15:49 瘋狂 閱讀(6279) 評論(0)  編輯  收藏 所屬分類: java
          可能會遇到這樣的情況,我可能要對Map<key,value>的集合進行排序,而這種排序又分為兩種情況,你可能按key值排序;另外你也可能會遇到按value值進行排序的情況。

                 大家都知道,默認的情況下,TreeMap:是按key升序,進行排序的;LinkedHashMap:是按加入順序進行排序的;HashMap:內(nèi)部數(shù)值的順序并不是以存放的先后順序為主,而是以hash值的順序為主,其次才是存放的先后順序。在這里我們只討論如何實現(xiàn)HashMap的排序。

                1.我們先討論按key值進行排序
          我們先看一下這個Sorter類:

          public class Sorter {

              public static Map sort(Map map) {
                  Map<Object, Object> mapVK = new TreeMap<Object, Object>(
                      new Comparator<Object>() {
                          public int compare(Object obj1, Object obj2) {
                              String v1 = (String)obj1;
                              String v2 = (String)obj2;
                              int s = v2.compareTo(v1);
                              return s;
                          }
                      }
                  );

                  Set col = map.keySet();
                  Iterator iter = col.iterator();
                  while (iter.hasNext()) {
                      String key = (String) iter.next();
                      Integer value = (Integer) map.get(key);
                      mapVK.put(key, value);
                  }
                  return mapVK;
              }
             
          }

          最后給出一個例子:
          public class SortHashMap {

              public SortHashMap() {

              }

              public static void main(String[] args) {
                  Map<String, Integer> maps = new HashMap<String, Integer>();
                  maps.put("boy", 8);
                  maps.put("cat", 7);
                  maps.put("dog", 1);
                  maps.put("apple", 5);
                  //排序前的輸出
                  Set set = maps.entrySet();
                  Iterator i = set.iterator();
                  while(i.hasNext()){
                      Map.Entry<String, Integer> entry1=(Map.Entry<String, Integer>)i.next();
                      System.out.println(entry1.getKey() + "-------->" + entry1.getValue());
                  }

                  System.out.println("----------------");
                   //排序后的輸出
                  Map<String, Integer> sortMaps = Sorter.sort(maps);
                  Set sortSet = sortMaps.entrySet();
                  Iterator ii = sortSet.iterator();
                  while(ii.hasNext()){
                      Map.Entry<String, Integer> entry1=(Map.Entry<String, Integer>)ii.next();
                      System.out.println(entry1.getKey() + "-------->" + entry1.getValue());
                  }
                 
              }
          }

          排序前的輸出結(jié)果是:
          cat-------->7
          apple-------->5
          dog-------->1
          boy-------->8

          排序后的輸出結(jié)果是:
          dog-------->1
          cat-------->7
          boy-------->8
          apple-------->5
          經(jīng)過排序后的Map有序了,是按照字母的逆序排列的。

          2、我們再討論如何按value值進行排序。
          還是上面的那個例子,我們想要按照各類對象的數(shù)量打印出類別的名稱。
          我們再來修改一下這個SortHashMap類:

          public class SortHashMap {

              public SortHashMap() {

              }

              public static void main(String[] args) {
                  Map<String, Integer> maps = new HashMap<String, Integer>();
                  maps.put("boy", 8);
                  maps.put("cat", 7);
                  maps.put("dog", 1);
                  maps.put("apple", 5);
                  //排序前的輸出
                  Set set = maps.entrySet();
                  Iterator i = set.iterator();
                  while(i.hasNext()){
                      Map.Entry<String, Integer> entry1=(Map.Entry<String, Integer>)i.next();
                      System.out.println(entry1.getKey() + "-------->" + entry1.getValue());
                  }

                  System.out.println("----------------");
                  //排序后的輸出
               List<Map.Entry<String, Integer>> info = new ArrayList<Map.Entry<String, Integer>>(maps.entrySet());
                  Collections.sort(info, new Comparator<Map.Entry<String, Integer>>() {
                      public int compare(Map.Entry<String, Integer> obj1, Map.Entry<String, Integer> obj2) {
                          return obj2.getValue() - obj1.getValue();
                      }
                  });

                  for (int j = 0; j<info.size();j++) {
                      System.out.println(info.get(j).getKey() + "------->" + info.get(j).getValue());
                  }
              }
          }

          排序前的輸出結(jié)果是:
          cat-------->7
          apple-------->5
          dog-------->1
          boy-------->8

          排序后的輸出結(jié)果是:
          boy------->8
          cat------->7
          apple------->5
          dog------->1

          程序運行的結(jié)果,達到了我們的要求,實現(xiàn)了Map的排序。該方法主要是利用了ArrayList的排序?qū)崿F(xiàn)了Map的排序輸出,并沒有影響到Map的存放結(jié)構(gòu)。

          主站蜘蛛池模板: 柳州市| 临海市| 武功县| 怀化市| 兰西县| 五峰| 建湖县| 江门市| 嘉义市| 阳曲县| 台前县| 南江县| 万山特区| 同江市| 休宁县| 顺平县| 海原县| 佛学| 保靖县| 泗洪县| 嘉峪关市| 湄潭县| 无为县| 宁晋县| 海口市| 宿州市| 哈巴河县| 旬邑县| 乌兰县| 武定县| 上饶县| 类乌齐县| 东明县| 偏关县| 淮北市| 阳新县| 宜章县| 溆浦县| 防城港市| 洛南县| 雷山县|