前言:
关于Map按照Key和Value排序的实现(code),更为重要的是如何将排序后的Map按照顺序取出后重新赋值给另外一个Map时,需要注意的问题:HashMap是没有顺序的,其原理是根据hash值进行分桶的。(HashMap没有顺序,TreeMap和LinkHashMap是有顺序的)
一、Map按照Key和Value排序的实现代码
如下:(这里的方法是通用的,key和value的类型没有要求,如果是自定义的类,需要实现Comparable接口)
/**
* Sort Map by value
* @author huxiutao
*
* @param <T>
*/
class ValueComparator<T extends Comparable<T>> implements Comparator<T> {
Map<String, T> base;
public ValueComparator(Map<String, T> base) {
super();
this.base = base;
}
@Override
public int compare(T arg0, T arg1) {
// TODO Auto-generated method stub
int compareTo = base.get(arg0).compareTo(base.get(arg1));
// 降序
if (compareTo>=0) {
return -1;
}
return 1;
}
}
/**
* Sort map by key
* @author huxiu
*
* @param <T>
*/
class KeyComparator<T extends Comparable<T>> implements Comparator<T> {
Map<String, T> base;
public KeyComparator(Map<String, T> base) {
super();
this.base = base;
}
@Override
public int compare(T arg0, T arg1) {
// TODO Auto-generated method stub
int compareTo = arg0.compareTo(arg1);
// 降序
if (compareTo>=0) {
return -1;
}
return 1;
}
}
使用示例:
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
/**
*
* @author Huxiutao
*
*/
public class SortMap {
/**
* 1. Test for Sort Map by Key
* 2. Test for Sort Map by value;
*
* @param args
*/
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("A", "403");
map.put("C", "98");
map.put("B", "0023");
ValueComparator valueComparator = new ValueComparator(map);
TreeMap<String, String> valueTreeMap = new TreeMap<String, String>(valueComparator);
System.out.println("原始Map: " + map);
valueTreeMap.putAll(map);
System.out.println("按照Value降序后的Map: " + valueTreeMap);
KeyComparator keyComparator = new KeyComparator(map);
TreeMap<String, String> keyTreeMap = new TreeMap<String, String>(keyComparator);
keyTreeMap.putAll(map);
System.out.println("按照Key降序后的Map: " + keyTreeMap);
}
}
二、Map的有序性
HashMap没有顺序,HashMap的原理是根据hash值进行分桶的。
TreeMap和LinkedHashMap则是有顺序的,所以在上面的示例中,要将HashMap中的值重新赋值(TreeMap.putAll)给TreeMap。