【问题标题】:Tree Map Comparator Function Overloading树图比较器函数重载
【发布时间】:2018-08-24 11:27:18
【问题描述】:

我试图添加一个自定义比较器来对地图进行排序, 以下是我的比较器,

public static class MyComparator implements Comparator<String> {

    private String NAME_REGEX = "M\\d+";

    public int compare(String o1, String o2) { 

        if (o1.matches(NAME_REGEX) && o2.matches(NAME_REGEX)) {
            try {
                return Integer.parseInt(o1.substring(1)) - Integer.parseInt(o2.substring(1));
            } catch (NumberFormatException ex) {
                return o1.compareTo(o2);
            }
        } else {
            return o1.compareTo(o2);
        }
    }
}

而我的用法如下,

public static void main(String[] args) {

    Map<String, String> map = new TreeMap<String, String>() { 
        @Override
        public Comparator<? super String> comparator() {
            return new MyComparator();
        }
    }; 

    map.put("M10", "data");
    map.put("M9", "data");
    map.put("M11", "data");
    map.put("M12", "data");
    map.put("M6", "data");

    for (String keys : map.keySet()) {
        System.out.print(keys);
    }
}

此代码对树形图的比较机制没有影响。

但是当我将MyComparator 实例作为构造函数参数传递时,键将使用MyComparator 进行排序。

为什么第一种方法失败了?

【问题讨论】:

    标签: java comparator treemap


    【解决方案1】:

    查看TreeMap.put 的来源时,我们看到它直接引用了比较器:

    public V put(K key, V value) {
        ...
        //cpr is the the comparator being used
        Comparator<? super K> cpr = comparator;
        ....
    }
    

    这意味着它没有使用您覆盖的 comparator() 方法,这就解释了为什么它不起作用。

    【讨论】:

    • 谢谢。我阅读了树形图的源代码,发现只有当我将此地图实例传递给另一个地图“putAll”方法时才会调用我覆盖的函数。
    猜你喜欢
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2023-03-15
    • 2013-12-01
    相关资源
    最近更新 更多