Entry、keySet、entrySet概念和根据Key和Value对Map的倒序排序

1、Entry、keySet、entrySet概念

Entry

Entry是Map的一个内部接口,Entry中有getKey()、getValue、setValue方法。

HashMap中的内部类Node就是实现了Entry接口,Node用于存储HashMap中的节点信息,包含哈希值、键值对和指向下一个节点的指针,源码如下:

    static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
        public final K getKey()        { return key; }
        public final V getValue()      { return value; }
        public final String toString() { return key + "=" + value; }
        public final V setValue(V newValue) {
            V oldValue = value;
            value = newValue;
            return oldValue;
        }
        /*省略构造函数、hashCode、equals方法*/
    }

HashMap的完整源码解析参考之前的博客:HashMap源码解析

keySet()

keySet()方法返回值是Map中key值的集合;

entrySet()

entrySet()方法返回值是Entry集合,可以通过getKey()、getValue获取到Entry中的键和值。

2、根据key或value对Map排序

  1. 对key排序可以利用TreeMap实现,TreeMap默认按照升序排序,可以调用descendingMap方法变成降序排序。当然也可以使用value相同的排序方式。
  2. 对value排序先调用entrySet将Entry集合放入List中,然后重写List的Comparator方法实现降序排序。

3、示例代码

public class SortMapDemo {
	//获取KeySet
    private static void getKeySet(Map<Integer,Integer> map){
        //获取map的key的集合
        Set<Integer> keySet = map.keySet();
        //遍历输出key
        Iterator<Integer> iterator = keySet.iterator();
        while (iterator.hasNext()) {
            Integer next = iterator.next();
            System.out.println(next+":"+map.get(next));
        }
    }
    //获取EntrySet
    private static void getEntrySet(Map<Integer,Integer> map){
        //获取map的entry的集合
        Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();
        //遍历输出entry中的key和value
        Iterator<Map.Entry<Integer, Integer>> iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            Map.Entry<Integer, Integer> next = iterator.next();
            System.out.println(next.getKey()+":"+next.getValue());
        }
    }
    
    //按照value进行排序
    private static void sortByValue(Map<Integer,Integer> map) {
        //将键值对放入list中
        List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
        //重写list的排序算法,按照map中的value降序排列
        list.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
        //遍历list输出键值
        for (Map.Entry<Integer, Integer> e: list) {
            System.out.println(e.getKey()+":"+e.getValue());
        }
    }
    
    //按照key进行排序
    private static void sortByKey(Map<Integer,Integer> map) {
        Map<Integer,Integer> treeMap = new TreeMap<>(map);
        //实现按照key倒序排列
        treeMap = ((TreeMap<Integer, Integer>) treeMap).descendingMap();
        //遍历list输出键值
        for (Map.Entry<Integer, Integer> e : treeMap.entrySet()) {
            System.out.println(e.getKey()+":"+e.getValue());
        }
    }
    public static void main(String[] args) {
        Map<Integer,Integer> map = new HashMap<>();
        map.put(1, 2);
        map.put(3, 3);
        map.put(2, 1);
        System.out.println("getKeySet");
        getKeySet(map);
        System.out.println("getEntrySet");
        getEntrySet(map);
        System.out.println("sortByValue");
        sortByValue(map);
        System.out.println("sortByKey");
        sortByKey(map);
    }
}

你可能感兴趣的:(Java)