[Java] 將Map按Key(主鍵/關(guān)鍵字)或Value(值)排序

?在書寫程序的過程中,常常需要對map的key或者value進(jìn)行排序,Java本身沒有提供對map排序的方法,下面的代碼展示如何手動對map進(jìn)行排序

1、按Key排序

jdk內(nèi)置的java.util包的TreeMap<K,V>可以實(shí)現(xiàn)對Key的排序,通過構(gòu)造方法中傳入比較器Comparator即可實(shí)現(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無法直接實(shí)現(xiàn)對map的value的排序,因此需要借助其他數(shù)據(jù)結(jié)構(gòu)來進(jìn)行排序。這里使用Collectionssort方法,將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)行排序。


參考文章

? Java Map 按Key排序和按Value排序

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java集合類可用于存儲數(shù)量不等的對象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 2,082評論 0 13
  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,452評論 0 16
  • title: Java Map 按key排序和按Value排序date: 2016/8/31 15:24:13ta...
    Skye_kh閱讀 66,807評論 1 9
  • 在一個方法內(nèi)部定義的變量都存儲在棧中,當(dāng)這個函數(shù)運(yùn)行結(jié)束后,其對應(yīng)的棧就會被回收,此時,在其方法體中定義的變量將不...
    Y了個J閱讀 4,573評論 1 14
  • 1.Java集合框架是什么?說出一些集合框架的優(yōu)點(diǎn)? 每種編程語言中都有集合,最初的Java版本包含幾種集合類:V...
    Oneisall_81a5閱讀 960評論 0 10

友情鏈接更多精彩內(nèi)容