根据值的数量对TreeMap进行排序

时间:2017-08-30 04:05:50

标签: java compare treemap

我想将Comparator重新定义为HashSet的大小,但是我得到了compare方法必须覆盖或实现超类型方法的错误。

如何创建具有Hashset大小比较的TreeMap?

private Map<Integer, HashSet<Integer>> nodes = new TreeMap<>(
    new Comparator(){
        @Override
        public int compare(HashSet<Integer> o1 , HashSet<Integer> o2) {     
            return (o1.size()).compareTo(o2.size());
                            //o2.size().compareTo(o1.size());
        }
    });

1 个答案:

答案 0 :(得分:0)

您可以使用Comparator并编写比较代码,根据HashSet大小对值进行排序,如下所示:

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

public class Solution {
    public static void main(String[] args) {
        Map<String, HashSet<Integer>> map = new HashMap<String, HashSet<Integer>>();
        HashSet<Integer> aSet = new HashSet<>();
        aSet.add(1);
        aSet.add(2);
        aSet.add(3);
        aSet.add(4);
        aSet.add(5);
        map.put("a", aSet);
        HashSet<Integer> bSet = new HashSet<>();
        bSet.add(1);
        bSet.add(2);
        bSet.add(3);
        bSet.add(4);
        map.put("b", bSet);
        HashSet<Integer> cSet = new HashSet<>();
        cSet.add(1);
        cSet.add(2);
        cSet.add(3);
        cSet.add(4);
        cSet.add(5);
        cSet.add(6);
        cSet.add(7);
        map.put("c", cSet);
        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) {
        HashSet<Integer> valueA = (HashSet<Integer>) map.get(keyA);
        HashSet<Integer> valueB = (HashSet<Integer>) map.get(keyB);
        Integer valASize = valueA.size();
        Integer valBSize = valueB.size();
        return valASize.compareTo(valBSize);
    }
}