Компаратор Java TreeMap <String, Pair <Integer, String> на Pair <Integer, String>

У меня есть TreeMap с ключом, являющимся строкой, а значением - парой, тип (Integer, String), и мне нужно, чтобы моя treeMap была упорядочена по ключу пары. Я мало работал с парами, и мне любопытно, как это сделать.

Мне сложно создать компаратор TreeMap для пары. В настоящее время я добавляю пару на карту после моей функции добавления. Нужно ли мне создавать подкласс для самой пары и использовать компаратор внутри подкласса, или я могу просто получить доступ к паре в классе treeMap через компаратор. Это то, к чему я пытаюсь добавить компаратор.

private final TreeMap<String, Pair<Integer, String>> cacheFiles;
public Cache(int size) {
    this.cacheFiles = new TreeMap<String, Pair<Integer, String>>();
    this.size = size;
    this.currSize =0;
}
public void add(String fname, int cost, String contents) {
    if (!cacheFiles.containsKey(fname)) {
        updateSize(cost);
        cacheFiles.put(fname, new Pair<Integer, String>(cost, contents));
    }

Мне нужна моя TreeMap, упорядоченная по «стоимости», чтобы при удалении firstEntry или lastEntry она удаляла самую большую или самую маленькую стоимость, поскольку я не могу отслеживать ключ для каждой записи карты, которую, возможно, придется удалить в данной точке.

Это вроде как то, что я пробовал ... Но редактору не нравится, когда я пытаюсь использовать компаратор Pair.

Спасибо за любую помощь!

    public Cache(int size) {
    this.cacheFiles = new TreeMap<String, Pair<Integer, String>>(new Comparator<Pair>() {
        public int compare(Pair<Integer, String> p1, Pair<Integer, String> p2) {
            return o1.getKey().compareTo(o2.getKey());
        }
        });
    this.size = size;
    this.currSize =0;
}

Я думаю, вы получаете значение (пара) из карты в компараторе и отсортируете ключи на его основе

nitnamby 27.04.2018 23:46

TreeMap не может быть отсортирован по значениям, потому что это нарушает спецификацию SortedMap. Смотрите в этом вопросе доступные решения stackoverflow.com/questions/2864840

Bedla 27.04.2018 23:52

Да, я видел это решение, но оно основано на простом значении, не вложенном в ключ? Я попытался применить это как решение, и у меня все еще возникают проблемы, так как я не могу добраться до ключа, захватив значение, с которым он сравнивает. Я также попытался создать класс KeyValuePair и иметь мою карту <String, KeyValuePair> и создать компаратор на моем ключе в этой паре, но без особого успеха.

tw123 28.04.2018 00:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
20
0

Другие вопросы по теме