首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

请教怎样根据一个TreeMap的值中的数据进行排序

2012-01-15 
请问怎样根据一个TreeMap的值中的数据进行排序?现在的需求是TreeMap已经是对方传来的数据,所以不能改变(改

请问怎样根据一个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()));            } 

热点排行