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