TreeMap сортировать по значению, если значение является экземпляром - PullRequest
0 голосов
/ 19 октября 2018

Я должен написать компаратор, который позволит мне сортировать TreeMap по getScore, в экземпляре которого будет Value вместо естественного упорядочения по умолчанию.Ранее я нашел одно решение моей проблемы ( TreeMap сортировка по значению ), но проблема осталась.Когда я вызываю e1.getValue, они не разрешают методы экземпляра.Как я могу получить их?

public class Trending {

        Map<String, Topic> treeMap = new TreeMap<>();


        void initialScore(int id, String topic, int score){
            Topic object = new Topic(id, topic, score);
            treeMap.put(topic, object);
        }



        static <String, Topic extends Comparable<Topic>>
        SortedSet<Map.Entry<String,Topic>> entriesSortedByValues(Map<String,Topic> map) {
            SortedSet<Map.Entry<String,Topic>> sortedEntries = new TreeSet<Map.Entry<String,Topic>>(
                    new Comparator<Map.Entry<String,Topic>>() {
                        @Override public int compare(Map.Entry<String,Topic> e1, Map.Entry<String,Topic> e2) {
                            int res = e1.getValue().compareTo(e2.getValue());
                            return res != 0 ? res : 1;
                        }
                    }
            );
            sortedEntries.addAll(map.entrySet());
            return sortedEntries;
        }

    }

1 Ответ

0 голосов
/ 10 ноября 2018

Вы можете объявить ваш метод entriesSortedByValues как неуниверсальный (который скрыл бы класс Topic, как указано в первом комментарии вашего вопроса):

static SortedSet<Map.Entry<String, Topic>> entriesSortedByValues(Map<String, Topic> map) {
        SortedSet<Map.Entry<String, Topic>> sortedEntries = new TreeSet<Map.Entry<String, Topic>>(
            new Comparator<Map.Entry<String, Topic>>() {
                @Override
                public int compare(Map.Entry<String, Topic> e1, Map.Entry<String, Topic> e2) {
                    int res = e1.getValue().compareTo(e2.getValue());
                    return res != 0 ? res : 1;
                }
            }
        );
        sortedEntries.addAll(map.entrySet());
        return sortedEntries;
}

, а затем сделать ваш Topicкласс реализации Comparable:

public class Topic implements Comparable<Topic> {
    private final int id;
    private final String topic;
    private final int score;

    public Topic(int id, String topic, int score) {
        this.id = id;
        this.topic = topic;
        this.score = score;
    }

    public int getScore() {
        return score;
    }

    @Override
    public int compareTo(Topic o) {
        return Integer.compare(getScore(), o.getScore());
    }
}
...