您的位置:首页 > 其它

(9)Map按键和按键值排序

2016-03-19 16:44 585 查看
Map按键升序排序可以直接new一个TreeMap对象就可以实现了,要按键降序的话,需要重构TreeMap的Comparator比较器。这里给出了两种Map按值排序的方式。

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.TreeMap;

public class SortMap {

public static void main(String args[]){
//Map按键排序
//Map中的TreeMap默认按照键升序排序
Map<String, String> map1 = new TreeMap<String, String>();
map1.put("b", "ccccc");
map1.put("d", "aaaaa");
map1.put("c", "bbbbb");
map1.put("a", "ddddd");
System.out.println("按键升序排序:"+map1);
//通过是比较器Comparator,可以使Map按照键降序排序
Map<String, String> map2 = new TreeMap<String, String>(
new Comparator<String>() {
public int compare(String obj1, String obj2) {
// 降序排序
return obj2.compareTo(obj1);
}
});
map2.putAll(map1);
System.out.println("按键降序排序:"+map2);
System.out.println("按键值升序排序:"+sortByValue(map1));
//按键值降序排序
HashMap<String,Double> map = new HashMap<String,Double>();
ValueComparator bvc =  new ValueComparator(map);
TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc);
map.put("A",99.5);
map.put("B",67.4);
map.put("C",67.4);
map.put("D",67.3);
System.out.println("unsorted map: "+map);
sorted_map.putAll(map);
System.out.println("results: "+sorted_map);
System.out.println(sortByValue(map));
}

public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map){
//将map.entrySet()转换成list
LinkedList<Map.Entry<K, V>> list =  new LinkedList<Map.Entry<K, V>>( map.entrySet() );
//然后通过比较器来实现排序
Collections.sort( list, new Comparator<Map.Entry<K, V>>() {
////升序排序
public int compare( Map.Entry<K, V> o1, Map.Entry<K, V> o2 ){
return (o1.getValue()).compareTo( o2.getValue() );
//return (o2.getValue()).compareTo( o1.getValue() );//降序排序
}
} );

Map<K, V> result = new LinkedHashMap<K, V>();
for (Map.Entry<K, V> entry : list) {
result.put( entry.getKey(), entry.getValue() );
}
return result;
}

static class ValueComparator implements Comparator<String> {

Map<String, Double> base;
public ValueComparator(Map<String, Double> base) {
this.base = base;
}

// 由大到小排序
public int compare(String a, String b) {
if (base.get(a) >= base.get(b)) {
return -1;
} else {
return 1;
} // returning 0 would merge keys
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: