前言:
關於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。