Перегрузка функции карты дерева

Kajal спросил: 31 июля 2018 в 09:47 в: java

Я пытался добавить собственный compartor для сортировки карты. Следующим является мой компаратор,

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);
    }
}

этот код не влияет на механизм сравнения treemap.

Но когда я передаю экземпляр MyComparator в качестве параметра конструктора, ключи сортируются с помощью MyComparator.

Почему первый подход не удался?

1 ответ

Есть решение
ernest_k ответил: 31 июля 2018 в 09:58

Если посмотреть на источник TreeMap.put, мы увидим, что он ссылается на компаратор напрямую:

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

Это означает, что он не использует вашу переопределенную информацию , и это объясняет, почему он не работает.

Kajal ответил: 01 августа 2018 в 11:06
благодарю вас. Я прочитал исходный код древовидной карты и узнал, что переопределенная функция будет вызываться только при передаче этого экземпляра карты другому методу putAll карт.