?在書寫程序的過程中滥朱,常常需要對map的key或者value進(jìn)行排序鞍历,Java本身沒有提供對map排序的方法乌询,下面的代碼展示如何手動對map進(jìn)行排序
1呀打、按Key排序
jdk內(nèi)置的java.util包的TreeMap<K,V>可以實現(xiàn)對Key的排序矢赁,通過構(gòu)造方法中傳入比較器Comparator即可實現(xiàn),這里Comparator類型輸入的泛型參數(shù)是K的超類或本身贬丛,即TreeMap(Comparator<? super K> comparator)
相關(guān)代碼
public class MapSortDemo {
public static void main(String[] args) {
Map<String, String> map = new TreeMap<String, String>();
map.put("KFC", "kfc");
map.put("WNBA", "wnba");
map.put("NBA", "nba");
map.put("CBA", "cba");
Map<String, String> resultMap = sortMapByKey(map); //按Key進(jìn)行排序
for (Map.Entry<String, String> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
/**
* 使用 Map按key進(jìn)行排序
* @param map
* @return
*/
public static Map<String, String> sortMapByKey(Map<String, String> map) {
if (map == null || map.isEmpty()) {
return null;
}
Map<String, String> sortMap = new TreeMap<String, String>(
new MapKeyComparator());
sortMap.putAll(map);
return sortMap;
}
}
比較器類
class MapKeyComparator implements Comparator<String>{
@Override
public int compare(String str1, String str2) {
return str1.compareTo(str2);
}
}
2撩银、按Value排序
在很多場景下,需要對value排序豺憔,Java無法直接實現(xiàn)對map的value的排序额获,因此需要借助其他數(shù)據(jù)結(jié)構(gòu)來進(jìn)行排序够庙。這里使用Collections
的sort
方法,將map轉(zhuǎn)化為list結(jié)構(gòu)抄邀,對list進(jìn)行排序耘眨,之后在把list中數(shù)據(jù)裝回map,達(dá)到排序目的境肾。在裝回map過程中剔难,使用LinkedHashMap
保證裝回的順序與list一致。
例如奥喻,我們需要對一些多個圓形軌道上物體的位置進(jìn)行排序偶宫,每個物體都有一個位置屬性,位置包含所處的軌道和物體的初始角度环鲤,現(xiàn)在要求只按照初始角度進(jìn)行從小到大的排序纯趋。
代碼如下
/**
* poisiton是一個map,保存每個物體對應(yīng)的位置
*/
Map<E, Position> sortedMap = new LinkedHashMap<E, Position>();
List<Map.Entry<E, Position>> entryList = new ArrayList<Map.Entry<E, Position>>(position.entrySet()); //先轉(zhuǎn)為entrySet冷离,在轉(zhuǎn)為List
Collections.sort(entryList, new MapValueComparator<E>());
Iterator<Entry<E, Position>> iter = entryList.iterator();
Map.Entry<E, Position> tmpEntry = null;
while (iter.hasNext()) {
tmpEntry = iter.next();
sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue()); //add sorted object in map
}
/**
* 比較器類
* 根據(jù)軌道物體對象的初始角度對position映射進(jìn)行升序排序
*
* @param <E> 軌道物體類型
*/
class MapValueComparator<E> implements Comparator<Map.Entry<E, Position>> {
@Override
public int compare(Entry<E, Position> o1, Entry<E, Position> o2) {
double a1 = o1.getValue().getAngle();
double a2 = o2.getValue().getAngle();
/*
* compare函數(shù)返回的數(shù)值正負(fù)遵循規(guī)則:
* compare(a,b)
* 一切以升序排列吵冒,如果 a 與 b 比較返回正數(shù),說明a應(yīng)該排在b后面酒朵,即a比b大
* 如果 a b比較返回負(fù)數(shù)桦锄,說明a小于b,a排在b前面
*/
if(a1 > a2) return 1; //a1角度大于a2蔫耽,返回正數(shù)
else if(a1 < a2) return -1;
if(Math.abs(a1 - a2) < 1e-10) return 0;
return 0;
}
}
這里的代碼說明如果value是一個類,那么可以針對類中某一個具體屬性進(jìn)行排序留夜,也可綜合考慮多個屬性進(jìn)行排序匙铡。
參考文章