A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑雪 中级黑马   /  2013-4-28 15:49  /  1975 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑雪 于 2013-5-1 10:29 编辑

之前看到一个帖子问:假如有个TreeMap<key,value>,如今想按value给这个TreeMap排序可以实现 ?
我想定义一个比较器实现Comparator接口,完成按value排序,然后将其对象传递给TreeMap的构造函数,从而实现按value给TreeMap<key,value>进行排序,就是说通过put方法添加元素时就按value进行排序。不知比较器部分代码如何写?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

正序浏览
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.Iterator;
  5. import java.util.LinkedHashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.TreeMap;


  9. public class T {

  10.         public static void main(String[] args) {
  11.                 TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();

  12.                 tm.put('a', 1);
  13.                 tm.put('c', 3);
  14.                 tm.put('y', 6);
  15.                 tm.put('f', 2);

  16.                 System.out.println(sort(tm));
  17.         }
  18.         
  19.         /** TreeMap的顺序是自然顺序(如整数从小到大),也可以指定比较函数。但不是插入的顺序
  20.          *  返回LinkedHashMap,以支持插入的顺序 */
  21.         private static LinkedHashMap<Character,Integer> sort(TreeMap<Character,Integer> map) {
  22.                 List<Map.Entry<Character,Integer>> list = new ArrayList<Map.Entry<Character,Integer>>();
  23.                 Iterator<Map.Entry<Character,Integer>> iter = map.entrySet().iterator();
  24.                 while(iter.hasNext()) {
  25.                         Map.Entry<Character,Integer> entry = iter.next();
  26.                         list.add(entry);
  27.                 }
  28.                 Collections.sort(list, new Comparator<Object>() {
  29.                         @SuppressWarnings("unchecked")
  30.                         @Override
  31.                         public int compare(Object o1, Object o2) {
  32.                                 Map.Entry<Character,Integer> entry1 = (Map.Entry<Character,Integer>)o1;
  33.                                 Map.Entry<Character,Integer> entry2 = (Map.Entry<Character,Integer>)o2;
  34.                                 return entry1.getValue() - entry2.getValue();
  35.                         }
  36.                 });
  37.                 LinkedHashMap<Character,Integer> sortedMap = new LinkedHashMap<Character,Integer>();
  38.                 for(Map.Entry<Character,Integer> entry : list) {
  39.                         sortedMap.put(entry.getKey(), entry.getValue());
  40.                 }
  41.                
  42.                 return sortedMap;
  43.         }
  44. }

复制代码
其实这个帖子最早我也发过,比楼上的还早。
http://bbs.itheima.com/thread-45375-1-1.html
回复 使用道具 举报
你看的那个贴子是我回复的。代码在那上面http://bbs.itheima.com/forum.php ... mp;page=1#pid306718
回复 使用道具 举报
可以现实按value排序,但是必须使用第三方容器,map支持按key排序,但不支持按value排序。
要想按value排序。
必须先把map-->list或者map-->set;
然后让list或者set实现Compareor接口。
比较器部分这个可以用 匿名内部类的方式
我给你搞个代码..
里面有写..
下载下来自己看
是上次那个活动写的
自己看去吧

Main.zip

1.13 KB, 下载次数: 19

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马