Java Map 按Key排序和按Value排序

复制代码
package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.Map.Entry;

public class MapSortDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Map<String, String> hMap = new HashMap<String, String>();
        hMap.put("a", "3");
        hMap.put("z", "2");
        hMap.put("b", "6");
        hMap.put("o", "9");

        System.out.println("根据key升序排序"); 
        Map<String, String> sortByKeyResultMap = sortMapByKey(hMap);    //按Key进行排序
        Iterator<Map.Entry<String, String>> sortByKeyEntries = sortByKeyResultMap.entrySet().iterator(); 
        while (sortByKeyEntries.hasNext()) { 
          Map.Entry<String, String> entry = sortByKeyEntries.next(); 
          System.out.println("Key = " + entry.getKey() + "------->Value = " + entry.getValue()); 
        }
        
        System.out.println("------------------------------"); 
        
        System.out.println("根据value降序排序"); 
        Map<String, String> sortByValueResultMap = sortMapByValue(hMap); //按Value进行排序
        Iterator<Map.Entry<String, String>> sortByValueEntries = sortByValueResultMap.entrySet().iterator(); 
        while (sortByValueEntries.hasNext()) { 
          Map.Entry<String, String> entry = sortByValueEntries.next(); 
          System.out.println("Key = " + entry.getKey() + "------->Value = " + entry.getValue()); 
        }
    }
    /**
     * 使用 Map按key进行排序
     * @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());
        Map<String, String> sortMap = new TreeMap<String, String>(new Comparator<String>() {
            public int compare(String obj1, String obj2) {
                return obj1.compareTo(obj2);//升序排序
            }
        });
        sortMap.putAll(map);
        return sortMap;
    }
    
    /**
     * 使用 Map按value进行排序
     * @param map
     * @return
     */
    public static Map<String, String> sortMapByValue(Map<String, String> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }
        Map<String, String> sortedMap = new LinkedHashMap<String, String>();
        List<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(map.entrySet());
//        Collections.sort(entryList, new MapValueComparator());
        Collections.sort(
            entryList, 
            new Comparator<Map.Entry<String, String>>(){
                   public int compare(Entry<String, String> o1, Entry<String, String> o2) {
                       return o2.getValue().compareTo(o1.getValue());// 降序排序
                   }
            }
        );

        Iterator<Map.Entry<String, String>> iter = entryList.iterator();
        Map.Entry<String, String> tmpEntry = null;
        while (iter.hasNext()) {
            tmpEntry = iter.next();
            sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
        }
        return sortedMap;
    }
}
复制代码
复制代码
根据key升序排序
Key = a------->Value = 3
Key = b------->Value = 6
Key = o------->Value = 9
Key = z------->Value = 2
------------------------------
根据value降序排序
Key = o------->Value = 9
Key = b------->Value = 6
Key = a------->Value = 3
Key = z------->Value = 2
复制代码

如果想把map排序代码分离出来就添加两个类,分别为

复制代码
package test;

import java.util.Comparator;

public class MapKeyComparator implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }

}
复制代码
复制代码
package test;

import java.util.Comparator;
import java.util.Map;
import java.util.Map.Entry;

public class MapValueComparator implements Comparator<Map.Entry<String, String>> {

    @Override
    public int compare(Entry<String, String> o1, Entry<String, String> o2) {
        return o2.getValue().compareTo(o1.getValue());
    }

}
复制代码

注意o1和o2的位置,它们在前还是在后就会变化升序和降序的顺序。

用key排序用以下代码

 

 

用value排序用以下代码

 

posted @   silentmuh  阅读(5476)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
Live2D
欢迎阅读『Java Map 按Key排序和按Value排序』
  1. 1 Walk Thru Fire Vicetone
  2. 2 爱你 王心凌
  3. 3 Inspire Capo Productions - Serenity
  4. 4 Welcome Home Radical Face
  5. 5 粉红色的回忆 李玲玉
粉红色的回忆 - 李玲玉
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

夏天夏天悄悄过去留下小秘密

压心底 压心底 不能告诉你

晚风吹过温暖我心底 我又想起你

多甜蜜 多甜蜜 怎能忘记

不能忘记你 把你写在日记里

不能忘记你 心里想的还是你

浪漫的夏季 还有浪漫的一个你

给我一个粉红的回忆

喔 夏天夏天悄悄过去依然怀念你

你一言 你一语都叫我回忆

就在就在秋天的梦里 我又遇见你

总是不能忘记你

夏天夏天悄悄过去留下小秘密

压心底 压心底 不能告诉你

晚风吹过温暖我心底 我又想起你

多甜蜜 多甜蜜 怎能忘记

不能忘记你 把你写在日记里

不能忘记你 心里想的还是你

浪漫的夏季 还有浪漫的一个你

给我一个粉红的回忆

喔 夏天夏天悄悄过去依然怀念你

你一言 你一语都叫我回忆

就在就在秋天的梦里 我又遇见你

总是不能忘记你

不能忘记你 把你写在日记里

不能忘记你 心里想的还是你

浪漫的夏季 还有浪漫的一个你

给我一个粉红的回忆

喔 夏天夏天悄悄过去依然怀念你

你一言 你一语都叫我回忆

就在就在秋天的梦里 我又遇见你

总是不能忘记你

点击右上角即可分享
微信分享提示