日期:2014-05-20  浏览次数:20652 次

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

------解决方案--------------------
TreeMap<Key, Entity>


Key类应该是一个含有sort值,并且支持Comparable接口的(好根据Key),

因为你要重新排序,肯定要创建TreeMap<Key, Entity>了。
------解决方案--------------------
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;

}

}

}

}

------解决方案--------------------
重写比较器 类似LS的
------解决方案--------------------
可以排序的
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);
}
------解决方案--------------------
这样可以不?
Java code

 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()));
            }