Использование NavigableMap внутри NavigableMap - PullRequest
0 голосов
/ 04 августа 2020

Сегодня я пробовал использовать NavigableMap<K, V>, где K также является картой NavigableMap<K, V>. И реализовал NavigableMap<K, V> с использованием TreeMap<K, V>. Что ж, для теста я решил добавить пару элементов в основную карту дескрипторов. И эти элементы для ручки K - это вложенные NavigableMap<K, V> для K и V простые Integer, а для ручки V это просто String.

Для быстрого понимания что я имею в виду, лучше всего посмотреть на код:

 
NavigableMap<NavigableMap<Integer, Integer>, String> handle = 
    new TreeMap<NavigableMap<Integer,Integer>, String>();
        
NavigableMap<Integer, Integer> subMap = new TreeMap<Integer, Integer>();
subMap.put(43787483,  0);
subMap.put(785845574, 1);
    
NavigableMap<Integer, Integer> subMap2 = new TreeMap<Integer, Integer>();
subMap2.put(78473374,  0);
subMap2.put(478374879, 1);
        
handle.put(subMap, "SubMap 1");
handle.put(subMap2, "SubMap 2");

Но, к сожалению, код, который должен нормально работать, вылетает с ошибкой

java.lang.ClassCastException: class java.util.TreeMap cannot be cast to class java.lang.Comparable (java.util.TreeMap and java.lang.Comparable are in module java.base of loader 'bootstrap')

в строке

handle.put(subMap, "SubMap 1");

Я конечно понимаю, что тут что-то связанное с Comparator<K>, но тот же тест с простым NavigateMap<K, V> работает нормально и без исключений. Это тот же пример:

NavigableMap<Integer, String> handle = new TreeMap<Integer, String>();
        
handle.put(0, "SubMap 1");
handle.put(1, "SubMap 2");

Есть ли у вас какие-либо решения или предложения?

1 Ответ

0 голосов
/ 04 августа 2020

Поскольку TreeMap не реализует Comparable, вам необходимо указать свой Comparator, чтобы определить порядок расположения ключей.

NavigableMap<NavigableMap<Integer, Integer>, String> handle = 
   new TreeMap<>(
      (map1, map2) -> {/*return 0 if equal, < 0 if map1 goes first, and > 0 otherwise*/}
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...