Map按键排序(sort by key), 按值排序(sort by value)。

Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value)。

1、按键排序

jdk内置的java.util包下的TreeMap

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进行排序

        for (Map.Entry<String, String> entry : resultMap.entrySet()) {
            System.out.println(entry.getKey() + " " + 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());

        sortMap.putAll(map);

        return sortMap;
    }
}

比较器类

class MapKeyComparator implements Comparator<String>{

    @Override
    public int compare(String str1, String str2) {

        return str1.compareTo(str2);
    }
}

2、按值排序

按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,需要我们自己转换一下。
Map本身按值排序是很有意义的,很多场合下都会遇到类似需求,可以认为其值是定义的某种规则或者权重。

原理:将待排序Map中的所有元素置于一个列表中,接着使用Collections的一个静态方法 sort(List list, Comparator

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进行排序
//      Map<String, String> resultMap = sortMapByValue(map); //按Value进行排序

        for (Map.Entry<String, String> entry : resultMap.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
    }

    /**
     * 使用 Map按value进行排序
     * @param map
     * @return
     */
    public static Map<String, String> sortMapByValue(Map<String, String> oriMap) {
        if (oriMap == null || oriMap.isEmpty()) {
            return null;
        }
        Map<String, String> sortedMap = new LinkedHashMap<String, String>();
        List<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(
                oriMap.entrySet());
        Collections.sort(entryList, new MapValueComparator());

        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;
    }
}

比较器类

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

    @Override
    public int compare(Entry<String, String> me1, Entry<String, String> me2) {

        return me1.getValue().compareTo(me2.getValue());
    }
}
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于按key排序,可以使用TreeMap来实现。TreeMap是按照key的自然顺序或者指定的比较器排序的。 示例代码如下: ```java import java.util.*; public class MapSortByKey { public static void main(String[] args) { Map<String, Integer> map = new TreeMap<>(); map.put("apple", 4); map.put("banana", 2); map.put("orange", 3); map.put("peach", 1); // 按key升序排列 Map<String, Integer> sortedByKeyMap = new TreeMap<>(map); System.out.println(sortedByKeyMap); // {apple=4, banana=2, orange=3, peach=1} // 按key降序排列 Map<String, Integer> sortedByKeyDescMap = new TreeMap<>(Collections.reverseOrder()); sortedByKeyDescMap.putAll(map); System.out.println(sortedByKeyDescMap); // {peach=1, orange=3, banana=2, apple=4} } } ``` 对于按value排序,可以将Map转化为List,然后通过Comparator来实现排序。 示例代码如下: ```java import java.util.*; public class MapSortByValue { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("apple", 4); map.put("banana", 2); map.put("orange", 3); map.put("peach", 1); // 按value升序排列 List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet()); Collections.sort(list, Comparator.comparing(Map.Entry::getValue)); Map<String, Integer> sortedByValueMap = new LinkedHashMap<>(); for (Map.Entry<String, Integer> entry : list) { sortedByValueMap.put(entry.getKey(), entry.getValue()); } System.out.println(sortedByValueMap); // {peach=1, banana=2, orange=3, apple=4} // 按value降序排列 List<Map.Entry<String, Integer>> descList = new ArrayList<>(map.entrySet()); descList.sort(Collections.reverseOrder(Comparator.comparing(Map.Entry::getValue))); Map<String, Integer> sortedByValueDescMap = new LinkedHashMap<>(); for (Map.Entry<String, Integer> entry : descList) { sortedByValueDescMap.put(entry.getKey(), entry.getValue()); } System.out.println(sortedByValueDescMap); // {apple=4, orange=3, banana=2, peach=1} } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值