SortedMap с исключением ClassCast Comparator

Почему вы получаете ClassCastException в (Person p2 = (Person) o2;) в методе переопределенного сравнения. :(

Фактически вместо объекта Person значения в сравниваемом переопределенном методе поступают как «Джим» и «Джек» (значения ключа). Таким образом, Cast Cast Exception. Но почему это происходит с ключами, а не значениями i, e объектом Person, почему он применяется только для ключей. Есть ли другой способ сортировки на основе значений.

Пожалуйста, исправьте меня, если я ошибаюсь

1) Мы можем передать объект компаратора в TreeMap, который будет сортировать его соответственно.?

2) Всегда сортировка выполняется по клавишам. ?

3) Как мы можем сортировать карту по ее значениям, не используя больше объекта коллекции (возможно ли это) и почему не поддерживается по умолчанию?

общедоступный класс HashTableExamples {

/**
 * @param args
 */
public static void main(String[] args) {

    SortedMap persorSorted = new TreeMap(new Comparator() {

        @Override 
        public int compare(Object o1, Object o2) {
            Person p2 = (Person) o2;
            return 2;
        }
    });

    Person p = new Person(10);
    Person p1 = new Person(20);
    persorSorted.put("Jim", p);
    persorSorted.put("Jack", p1);
    Iterator sortedit = persorSorted.entrySet().iterator();
    while (sortedit.hasNext()) {
        Map.Entry pairs = (Map.Entry) sortedit.next();
        Person pw = (Person) pairs.getValue();
        System.out.println("From SortedMap : " + pw.getAge());
    }
}

public static class Person {
    Person(int agevalue) {
        this.age = agevalue;
    }

    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
3
nl ja de
Здесь вы должны использовать дженерики и создать правильный Comparator . Такой код даже не компилируется, если вы правильно использовали дженерики.
добавлено автор Matt Ball, источник
@MattBall Извините, что не использовал generics, я просто писал код, чтобы сортировать его на основе значений. Я думаю, что даже если мы будем использовать generics, он будет терпеть неудачу, поскольку ключ - это String. Я просто хотел знать, что я имею в виду, почему это ограничение для значений на карте
добавлено автор Suraj, источник
Это то, что делает TreeMap. Он сортируется по клавишам . Есть некоторые хакерские способы обойти это, включая хранение карты в компараторе.
добавлено автор Perception, источник

2 ответы

Если вы посмотрите на для TreeMap , вы увидите, что он говорит:

Создает новую пустую карту деревьев, упорядоченную в соответствии с данным компаратором. Все ключи, вставленные в карту, должны быть взаимно сопоставимы с данным компаратором: comparator.compare (k1, k2) не должны бросать ClassCastException для любых ключей k1 и k2 на карте. Если пользователь пытается поместить ключ в карту, которая нарушает это ограничение, вызов put (Object key, Object value) вызовет исключение ClassCastException.

Главное, что это сравнение ключей , но вы бросаете ключ (то есть: String ) в Person .

1
добавлено
Вы должны проверить @ LouisWasserman ответ по причине этого. Я просто повторяю то, что он говорит. Но что-то, что вы могли бы сделать (действительно зависит от области проблемы), - это поставить объект String in объекта Person, а затем использовать List и отсортировать его с помощью Comparator , который просматривает объект Person для этого поля. Кроме того, вы можете создать временный класс с полем name и person , а затем отсортировать List .
добавлено автор Daniel Kaplan, источник
Я могу это понять. Но почему это разрешено только для ключей. Есть ли какая-то конкретная причина, почему ее не допускают значения. Я имею в виду, что я могу использовать List для значений и Сортировать, но. Почему это ограничение для значений карты.
добавлено автор Suraj, источник
Я знаю, что обходное решение для сортировки на основе значений. Но я имею в виду Я. Я знаю, что обходной путь. Но я все еще не удовлетворен тем, почему он ограничен только ключами. Также может быть много сценариев, в которых значение будет объектом, и мы хотим отсортировать его. Я думаю, что я могу реализовать сопоставимые для объекта и отсортировать его. Но что, если у меня есть доступ к этому объекту :(
добавлено автор Suraj, источник

Да, TreeMap всегда сортирует по клавишам.

Что касается того, почему он не «поддерживается по умолчанию» - это потому, что в целом нет структуры данных, которая бы поддерживала ее эффективно. Он не поддерживается эффективно в любом языке программирования, потому что точка Map должна иметь возможность просматривать вещи своим ключом, а сортировка по значениям означает, что вы не может упорядочивать данные таким образом, чтобы эффективно просматривать вещи с помощью клавиш.

Если вы должны отсортировать записи Map по значению, вы можете использовать что-то вроде этого:

List> entryList = 
  new ArrayList>(map.entrySet());
Collections.sort(entryList, new Comparator>() {
  public int compare(Map.Entry entry1, Map.Entry entry2) {
    return entry1.getValue().compareTo(entry2.getValue());
  }
});

Альтернативно, если хотите, вы можете использовать альтернативный компаратор для сравнения значений, если вы не контролируете реализацию типа значения.

1
добавлено
Я согласен, но может быть много сценариев, где в значении будет объект, и мы хотим отсортировать его. Я думаю, что я могу реализовать сопоставимые для объекта и отсортировать его. Но что, если у меня есть доступ к этому объекту :(.
добавлено автор Suraj, источник
Я правильно, я знаю, что обходной путь для сортировки его на основе значений с помощью метода сортировки утилиты коллекций. Но мне было любопытно, почему не было компаратора по значениям для Карты или почему он ограничен только ключами
добавлено автор Suraj, источник
Я. это имеет смысл. «Карта должна иметь возможность смотреть на вещи по их ключу, а сортировка по значению означает, что вы не можете организовать данные таким образом, чтобы эффективно находить вещи с помощью ключей». Хм, хорошо, я пойду этим.
добавлено автор Suraj, источник
Я добавил некоторое объяснение, как упорядочить записи Map по значениям, но точка остается - просто невозможно написать эффективную реализацию Map , которая сортирует записи по значению, поэтому вам нужно сделать это другим способом, чем с помощью Map .
добавлено автор Louis Wasserman, источник
Как я уже говорил несколько раз выше, невозможно или крайне неудобно предоставлять эффективную реализацию Map , которая сортирует на основе значений.
добавлено автор Louis Wasserman, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async