JAvaでのMapの値順

11782 ワード

多くの場合、Mapをソートする必要があります.ソートの根拠はMapの値です.簡単な例としては、例えばMapによって学生の点数を表し、そのMapを点数の高さから低さまで並べたい.より複雑な例では、Map>は共有便のグループを表し、keyは共有便番号であり、valueはこの便番号を共有するすべての便であり、その中でパイロット便は最初の要素に位置しており、私たちは今、パイロット便の時間に基づいてソートしたいと考えています.
ソリューションは次のとおりです.
    private LinkedHashMap> sortHashMapByValues(
            Map> passedMap , Comparator> comparator) {
        List mapKeys = new ArrayList<>(passedMap.keySet());
        List> mapValues = new ArrayList<>(
                passedMap.values());
        Collections.sort(mapValues, comparator);
        Collections.sort(mapKeys);

        LinkedHashMap> sortedMap = new LinkedHashMap<>();

        Iterator> valueIt = mapValues.iterator();
        while (valueIt.hasNext()) {
            List val = valueIt.next();
            Iterator keyIt = mapKeys.iterator();

            while (keyIt.hasNext()) {
                String key = keyIt.next();
                List comp1 = passedMap.get(key);
                List comp2 = val;

                if (comp1.equals(comp2)) {
                    keyIt.remove();
                    sortedMap.put(key, val);
                    break;
                }
            }
        }
        return sortedMap;
    }

Comparatorの実装は次のとおりです.
public class RTFlightArrivalComparator implements
        Comparator<List<Flight>> {

    @Override
    public int compare(List o1,
            List o2) {

        Flight first1 = o1.get(0);
        Flight first2 = o2.get(0);

        return first1.getSta().compareTo(first2.getSta());
    }

}

LinkedHashMapは、挿入順序に関連する(Insertion-Order)順序によって、このスキームの効率が比較的低い双方向チェーンテーブルを維持している.次に、TreeMapを使用してソートを実装する例を示します.TreeMapはキーをソートし、カスタムコンパレータComparatorを受け入れることができます.
import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;

public class SortMapByValue {

    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("a", 10);
        map.put("b", 30);
        map.put("c", 50);
        map.put("d", 40);
        map.put("e", 20);
        System.out.println(map);

        TreeMap sortedMap = sortMapByValue(map);  
        System.out.println(sortedMap);
    }

    public static TreeMap sortMapByValue(HashMap map){
        Comparator comparator = new ValueComparator(map);
        //TreeMap is a map sorted by its keys. 
        //The comparator is used to sort the TreeMap by keys. 
        TreeMap result = new TreeMap(comparator);
        result.putAll(map);
        return result;
    }
}

keyのコンパレータを実装する場合、値に基づいてソートしたいため、その順序は値に依存するため、コンパレータ構造の場合、ソートするMapを入力する必要があります.
// a comparator that compares Strings
class ValueComparator implements Comparator{

    HashMap map = new HashMap();

    public ValueComparator(HashMap map){
        this.map.putAll(map);
    }

    @Override
    public int compare(String s1, String s2) {
        if(map.get(s1) >= map.get(s2)){
            return -1;
        }else{
            return 1;
        }   
    }
}

上記のコードは特定のタイプのMapしか処理できません.以下では汎用的な方法を実現します.
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Solution {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("a", 10);
        map.put("b", 30);
        map.put("c", 50);
        map.put("d", 40);
        map.put("e", 20);
        System.out.println(map);

        Map sortedMap = sortByValue(map);
        System.out.println(sortedMap);
    }

    public static Map sortByValue(Map unsortedMap) {
        Map sortedMap = new TreeMap(new ValueComparator(unsortedMap));
        sortedMap.putAll(unsortedMap);
        return sortedMap;
    }

}

class ValueComparator implements Comparator {
    Map map;

    public ValueComparator(Map map) {
        this.map = map;
    }

    public int compare(Object keyA, Object keyB) {
        Comparable valueA = (Comparable) map.get(keyA);
        Comparable valueB = (Comparable) map.get(keyB);
        return valueB.compareTo(valueA);
    }
}
// a comparator using generic type
class ValueComparator> implements Comparator{

    HashMap map = new HashMap();

    public ValueComparator(HashMap map){
        this.map.putAll(map);
    }

    @Override
    public int compare(K s1, K s2) {
        return -map.get(s1).compareTo(map.get(s2));//descending order   
    }
}
public class SortMapByValue {

    public static void main(String[] args) {
        //  Map
        HashMap map = new HashMap();
        map.put("a", 10);
        map.put("b", 30);
        map.put("c", 50);
        map.put("d", 40);
        map.put("e", 20);
        System.out.println(map);


        Comparator comparator = new ValueComparator(map);
        TreeMap result = new TreeMap(comparator);
        result.putAll(map);

        System.out.println(result);

        //  Map

        HashMap map2 = new HashMap();
        map2.put(1, 10);
        map2.put(2, 30);
        map2.put(3, 50);
        map2.put(4, 40);
        map2.put(5, 20);
        System.out.println(map2);

        Comparator comparator2 = new ValueComparator(map2);
        TreeMap result2 = new TreeMap(comparator2);
        result2.putAll(map2);

        System.out.println(result2);

    }

}

(完)