现在的需求是TreeMap已经是对方传来的数据,所以不能改变(改成HashMap可以),按照TreeMap<String,Entity>的方式构成这个map,entity是一个实体,里面包含一个属性sort,实际上是要根据这个sort的值对这个TreeMap中的元素进行倒序排序,当然最后返回的值也必须是Map,哪位搞过类似的问题?
另外,根据key排序很好实现,但是根据value进行排序好像在网上找不到

解决方案 »

  1.   

    TreeMap<Key, Entity>
    Key类应该是一个含有sort值,并且支持Comparable接口的(好根据Key),因为你要重新排序,肯定要创建TreeMap<Key, Entity>了。
      

  2.   

    package test;import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Set;
    import java.util.TreeMap;public class SortMapByValue {
    public static void main(String[] args){
    TreeMap<String,Integer> newMap=new TreeMap<String,Integer>();
    newMap.put("dsaf1", 1);
    newMap.put("dsaf9", 9);
    newMap.put("dsaf4", 4);
    newMap.put("dsaf7", 7);
    newMap.put("dsaf6", 6);
    newMap.put("dsaf3", 3);
    newMap.put("dsaf10", 10);


    ByValueComparator bvc  =new ByValueComparator(newMap);
    List<String> newList=new ArrayList<String>(newMap.keySet());
    Collections.sort(newList, bvc);
    for(String str:newList){
    System.out.println(str+"================================="+newMap.get(str));
    }

    }

    /**
     * @description
     * 对HashMap按值进行排序
     * 
     * */
    static class ByValueComparator implements Comparator<String> { TreeMap<String, Integer> base_map; public ByValueComparator(TreeMap<String, Integer> base_map) { this.base_map = base_map; } public int compare(String arg0, String arg1) { if (!base_map.containsKey(arg0) || !base_map.containsKey(arg1)) { return 0; } if (base_map.get(arg0) < base_map.get(arg1)) { return 1; } else if (base_map.get(arg0) == base_map.get(arg1)) { return 0; } else { return -1; } } }}
      

  3.   

    你这个实际还是对List排序啊。你的例程中等于是对key的list,按值的大小倒序进行排序,但是最后返回的是值的List,我要求返回一个TreeMap
      

  4.   

    实现一个比较器吗?直接实现,是根据key进行排序的,不是根据value
      

  5.   

    刚看到一篇文章,全文如下:
    前几天有人问我一个问题,是对毕业生去向进行统计。统计每个去向的人数。我想用TreeMap来进行存储,需要进行排序。要求是根据人数来降序排序。关键是TreeMa是根据红黑树的数据结构,是平衡树,只能根据key来排序,是不能根据value来排序的。因为红黑树的数据结构就是根据key的大小来组织起来的,如果不根据key来排序根本就不能形成TreeMap。必须根据key来排序,默认是根据key的自然排序来组织,比如integer的大小,String的字典排序。如果你的key不能根据默认排序得到,你就需要来继承comparable接口,实现compareTo方法来定义自己的排序方法。Collator好像是国际化的问题,说的是java对于有中文的排序出问题。看来想在TreeMap中根据value来排序的想法是不能实现的了。只能换另一种解决方案了。
      

  6.   

    可以排序的
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("d", 2);
    map.put("c", 1);
    map.put("b", 1);
    map.put("a", 3);List<Map.Entry<String, Integer>> infoIds =
        new ArrayList<Map.Entry<String, Integer>>(map.entrySet());//排序前
    for (int i = 0; i < infoIds.size(); i++) {
        String id = infoIds.get(i).toString();
        System.out.println(id);
    }
    //d 2
    //c 1
    //b 1
    //a 3//排序
    Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {   
        public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {      
            //return (o2.getValue() - o1.getValue()); 
            return (o1.getKey()).toString().compareTo(o2.getKey());
        }
    }); //排序后
    for (int i = 0; i < infoIds.size(); i++) {
        String id = infoIds.get(i).toString();
        System.out.println(id);
    }
      

  7.   

    这样可以不? HashMap<String, Integer> hm = new HashMap<String, Integer>();
            HashMap<String, Integer> hm2 = new HashMap<String, Integer>(); //最后需要的HashMap
            hm.put("a", 4);
            hm.put("b", 5);
            hm.put("c", 8);
            hm.put("d", 10);
            Iterator<String> i = hm.keySet().iterator();
            ArrayList<String> l1 = new ArrayList<String>();
            ArrayList<Integer> l2 = new ArrayList<Integer>();
            while(i.hasNext()) {
             String strr = i.next();
             l1.add(strr);
             l2.add(hm.get(strr));
            }
            for(int k = 0; k < l2.size();k++) {
             int tmp = k;
             for(int l = k+1; l < l2.size()-1;l++) {
             if(l2.get(tmp)<l2.get(l)) {
             tmp = l;
             }
             }
             String strs = l1.get(tmp);
             Integer ints = l2.get(tmp);
             hm2.put(strs, ints);
             l1.remove(tmp);
             l2.remove(tmp);
             k = -1;
            }
            Iterator<String> ii = hm2.keySet().iterator();
            while(ii.hasNext()) {
             System.out.println(hm2.get(ii.next()));
            }
      

  8.   

    exterminator的方法完全正确呀,多谢各位哈
      

  9.   

    看了半天,好像这样是实现了对TreeMap中的数据的排序。有没有这改变TreeMap本身排序规则的办法,而不是利用List结构将其中的数据取出来,再用Collections的sort方法排序的?也就是说,先用TreeMap(Comparator<? super K> comparator) 
    构造函数定义好规则,然后再将数据用putAll()放到TreeMap实例中去。
      

  10.   

    为什么我试过了不行呢,就是按照exterminator的方法啊,没有按值排序,输出只是按键排序了,是a=3
      b=1
      c=1
      d=2
      

  11.   

    /**
     * @author 
     * 对TreeMap按值进行排序的比较器
     *
     */
    public class ByValueComparator implements Comparator<Map.Entry<String, Integer>> {
        
        TreeMap<String, Integer> base_map;
        public ByValueComparator(TreeMap<String, Integer> base_map) {        this.base_map = base_map;        }
        @Override
        public int compare(Map.Entry<String, Integer> arg0, Map.Entry<String, Integer> arg1) {
            String key0=arg0.getKey();
            String key1=arg1.getKey();
            if (!base_map.containsKey(key0) || !base_map.containsKey(key1)) {            return 0;        }        if (base_map.get(key0) < base_map.get(key1)) {            return 1;        } else if (base_map.get(key0) == base_map.get(key1)) {            return 0;        } else {            return -1;        }
        }
    }
    接下来是调用该比较器的排序程序        TreeMap newMap = new TreeMap();        newMap.put("dsaf1", 1);
            newMap.put("dsaf9", 9);
            newMap.put("dsaf4", 4);
            newMap.put("dsaf7", 7);        ByValueComparator bvc  =new ByValueComparatornewMap);//newMap是要进行排序的TreeMap
            List<Map.Entry<String, Integer>> newList=new ArrayList<Map.Entry<String, Integer>>(map1.entrySet());
            Collections.sort(newList, bvc);
            for(Map.Entry<String, Integer> map:newList){
            System.out.println(map);
            }
      

  12.   

    上面的程序是我把2楼的程序修改了一下写出来的,这样得出的结果也是TreeMap,而且刚刚实现过了,没有问题