Java 树映射比较器函数重载

Java 树映射比较器函数重载,java,comparator,treemap,Java,Comparator,Treemap,我试图添加一个自定义比较器来对地图进行排序, 下面是我的比较 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

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

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);
        }
    }
}
公共静态类MyComparator实现Comparator{
私有字符串名称_REGEX=“M\\d+”;
公共整数比较(字符串o1,字符串o2){
if(o1.匹配(NAME_REGEX)和&o2.匹配(NAME_REGEX)){
试一试{
返回Integer.parseInt(o1.substring(1))-Integer.parseInt(o2.substring(1));
}捕获(NumberFormatException ex){
返回o1。与(o2)相比;
}
}否则{
返回o1。与(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);
    }
}
publicstaticvoidmain(字符串[]args){
Map Map=newtreemap(){
@凌驾

公共比较器查看
TreeMap.put
的源代码时,我们看到它直接引用比较器:

public V put(K key, V value) {
    ...
    //cpr is the the comparator being used
    Comparator<? super K> cpr = comparator;
    ....
}
public V put(K键,V值){
...
//cpr是正在使用的比较仪

Comparatorthank you.我阅读了tree map的源代码,并且知道只有当我将这个map实例传递给另一个maps“putAll”方法时,才会调用我重写的函数。