Java Map按Key和Value排序

Java Map按Key和Value排序

Java中Map的排序分为按Key和Value两种排序方法,排序顺序也有升序和降序

1. Map 按Key排序

Map按Key排序很简单,直接使用java.util.TreeMap就能实现,在JDK API中是这样描述TreeMap的:该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法。

那么默认情况下TreeMap按升序排列,降序就需要使用自定义的Comparator实现。

2. Map 按Value排序

Map按Value排序的思路是将Map映射放入list得到List<Map>,然后使用Comparator对其排序,将排序结果放入新的LinkedHashMap

Map --> List<Map> --> Collections.sort() --> List<Map> (Sorted) --> LinkedHashMap

3. Map 排序代码

package org.xinyo.core.utils;

import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class SortMap {
  // 按Key升序排序
  public static <K, V> Map<K, V> sortBykey(Map<K, V> unSortMap) {
    Map<K, V> sortedMap = new TreeMap<K, V>(unSortMap);
    return sortedMap;
  }

  // 按Key降序排序
  public static <K extends Comparable<? super K>, V> Map<K, V> sortBykey2(Map<K, V> unSortMap) {
    Map<K, V> sortedMap = new TreeMap<K, V>(new Comparator<K>() {
      @Override
      public int compare(K o1, K o2) {
        return o2.compareTo(o1);
      }
    });
    sortedMap.putAll(unSortMap);
    return sortedMap;
  }

  // 按Value升序排序
  public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
    List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(map.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
      public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
        return (o1.getValue()).compareTo(o2.getValue());// 降序:o2.getValue()).compareTo(o2.getValue()
      }
    });

    Map<K, V> sortedMap = new LinkedHashMap<K, V>();
    for (Map.Entry<K, V> entry : list) {
      sortedMap.put(entry.getKey(), entry.getValue());
    }
    return sortedMap;
  }
}