1. 程式人生 > >如何對map中的value進行排序

如何對map中的value進行排序

package com.demo.map;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * map排序
 * @author wang
 *
 */
public class SortMap {

    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("nine",9);
        map.put("six",6);
        map.put("name",6);
        map.put("eight",8);
        map.put("zero",0);
        map.put("one",1);
        map.put("four",4);
        map.put("two",2);
        
        //根據map中的key值排序
        
        sortMap(map);
    }
    
    public static void sortMap(Map<String, Integer> map){
        //獲取entrySet
        Set<Map.Entry<String,Integer>> mapEntries = map.entrySet();
        
        for(Entry<String, Integer> entry : mapEntries){
            System.out.println("key:" +entry.getKey()+"   value:"+entry.getValue() );
        }
        
        //使用連結串列來對集合進行排序,使用LinkedList,利於插入元素
        List<Map.Entry<String, Integer>> result = new LinkedList<>(mapEntries);
        //自定義比較器來比較連結串列中的元素
        Collections.sort(result, new Comparator<Entry<String, Integer>>() {
            //基於entry的值(Entry.getValue()),來排序連結串列
            @Override
            public int compare(Entry<String, Integer> o1,
                    Entry<String, Integer> o2) {
                
                return o1.getValue().compareTo(o2.getValue()) ;
            }
            
        });
        
        //將排好序的存入到LinkedHashMap(可保持順序)中,需要儲存鍵和值資訊對到新的對映中。
        Map<String,Integer> linkMap = new LinkedHashMap<>();
        for(Entry<String,Integer> newEntry :result){
            linkMap.put(newEntry.getKey(), newEntry.getValue());            
        }
        //根據entrySet()方法遍歷linkMap
        for(Map.Entry<String, Integer> mapEntry : linkMap.entrySet()){
            System.out.println("key:"+mapEntry.getKey()+"  value:"+mapEntry.getValue());
        }
    }

}

結果為:

key:zero  value:0
key:one  value:1
key:two  value:2
key:four  value:4
key:six  value:6
key:name  value:6
key:eight  value:8
key:nine  value:9

總結,這裡HashMap使用 內部類Entry<K, V>來儲存資料,因此,我們需要對儲存有鍵值對的Entry<K,V>物件進行排序來實現我們的HashMap排序的功能。這裡採用物件排序的方法,將

Entry<K,V>物件放入到List集合中,再使用自定義比較器對LinkedList集合排序。由於HashMap不儲存key-value對,因此採用LinkedHashMap(可保持順序)中,需要儲存鍵和值資訊對到新的對映中。其中要注意的是:Map集合的key是不允許重複的,一單重複等同於覆蓋,我在這裡就犯錯了。