1. 程式人生 > >根據Value對Map中的對象進行排序

根據Value對Map中的對象進行排序

value rabl 使用 .html stat pre 背景 添加 ash

背景

SortedMap的實現類TreeMap可以按自然順序或自定義順序遍歷鍵(key),有時我們需要根據值(Value)進行排序,本文提供了一種簡單實現思路。

實現

  • Comparator接口
    使用Value排序時,仍然使用TreeMap實現類,只不過需要在TreeMap的構造函數中引入Comparator實現。

  • TreeMap構造器
    ValueComparator是Comparator接口的實現,該實現包含了一個普通的Map對象作為成員變量,並在compare方法中做了一點手腳。即在compare方法中,將key的比較轉換為value的比較。

  • 局限性

  這種方式只能對Map進行排序,而不能添加單個key-value映射。

  • 具體實現代碼

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * Created by liutingna on 2017/9/30.
 */
public class TestComparator {
    class ValueComparator implements Comparator<String> {

        Map<String, Long> base;

        //Comparator外部比較器
        public ValueComparator(Map<String, Long> base) {
            this.base = base;
        }

        //根據Map的值進行比較
        public int compare(String a, String b) {
            return base.get(a).compareTo(base.get(b));
        }
    }

    public static void main(String[] args) {
        Map<String, Long> map = new HashMap<>();
        TestComparator testComparator = new TestComparator();
        TestComparator.ValueComparator valueComparator = testComparator.new ValueComparator(map);
        Map<String, Long> keySortMap = new TreeMap<>();
        Map<String, Long> valueSortMap = new TreeMap<>(valueComparator);

        map.put("aaa", 15L);
        map.put("bxw", 13L);
        map.put("abc", 14L);
        map.put("bbb", 18L);
        System.out.println(map);//{aaa=15, bxw=13, abc=14, bbb=18}

        //根據key進行比較
        keySortMap.putAll(map);
        System.out.println(keySortMap);//{aaa=15, abc=14, bbb=18, bxw=13}
        //根據value進行比較
        valueSortMap.putAll(map);
//        valueSortMap.put("ccc",17L);//NullPointerException,這種方式只能對Map進行排序,而不能添加單個key-value映射
        System.out.println(valueSortMap);//{bbb=18, aaa=15, abc=14, bxw=13}
    }
}

  

相關資料

Comparable和Comparator的區別

根據Value對Map中的對象進行排序