Как использовать сопоставимые по хэш-карте свойства объекта класса

1

У меня есть футбольный стол, который я пытаюсь сортировать по выигранным играм.

У меня есть класс, который реализует сопоставимые и смотрит на свойство won. Кажется, это возвращает правильное значение (1, -1 или 0).

class TeamStandings implements Comparable<TeamStandings>{
    protected int matchesPlayed = 0;
    protected int won = 0;
    protected int draw = 0;
    protected int loss = 0;
    protected int goalsScored = 0;
    protected int goalsConceded = 0;
    protected int goalDifference = 0;
    protected int points = 0;

    @Override
    public int compareTo(TeamStandings other){
        // compareTo should return < 0 if this is supposed to be
        // less than other, > 0 if this is supposed to be greater than 
        // other and 0 if they are supposed to be equal

        //System.out.println(this.won + " " + other.won + " " + Integer.valueOf(this.won).compareTo(Integer.valueOf(other.won)));
        return Integer.valueOf(this.won).compareTo(Integer.valueOf(other.won));

    }
}

Эта функция сортировки должна возвращать отсортированную хэш-карту. В hashmap есть имя команды в качестве ключа и экземпляр класса teamstandings в качестве значения.

private static HashMap sortByValues(HashMap map) { 
    List list = new LinkedList(map.entrySet());
    // Defined Custom Comparator here
    Collections.sort(list, new Comparator() {
        public int compare(Object o1, Object o2) {

            System.out.println(((Comparable) ((Map.Entry) (o1)).getValue()).compareTo(((Map.Entry) (o2)).getValue()));
            return ((Comparable) ((Map.Entry) (o1)).getValue())
                    .compareTo(((Map.Entry) (o2)).getValue());          
        }
    });

    // Here I am copying the sorted list in HashMap
    // using LinkedHashMap to preserve the insertion order
    HashMap sortedHashMap = new LinkedHashMap();
    for (Iterator it = list.iterator(); it.hasNext();) {
        Map.Entry entry = (Map.Entry) it.next();
        sortedHashMap.put(entry.getKey(), entry.getValue());
        //System.out.println(entry.getKey());
    } 
    return sortedHashMap;
}

Хеш-карта сортируется, берет строку для имени команды и объекта класса teamstandings, который содержит выигранные игры, потерянные и т.д.

По какой-то причине я не могу заставить таблицу сортировать. Он просто остается в несортированном порядке. Я считаю, что это что-то связано с функцией sortbyvalues в позиции collection.sort.

Любые идеи, как я могу использовать выигранную ценность в моем классе для сортировки хэш-карты?

public void printTable(){

    Map<String, TeamStandings> sortedTable = sortByValues(this.table);

    System.out.println("Group: " + this.groupLetter);
    System.out.println("Team" 
            + "\t" + "MP"
            + "\t" + "W"
            + "\t" + "D"
            + "\t" + "L"
            + "\t" + "GS"
            + "\t" + "GC"
            + "\t" + "GD"
            + "\t" + "P");

    //Iterator<Map.Entry<String, TeamStandings>> iterator = this.table.entrySet().iterator() ;
    Iterator<Map.Entry<String, TeamStandings>> iterator = sortedTable.entrySet().iterator() ;

    while(iterator.hasNext()){
        Map.Entry<String, TeamStandings> team = iterator.next();
        System.out.println(team.getKey() 
                + "\t" + team.getValue().matchesPlayed
                + "\t" + team.getValue().won
                + "\t" + team.getValue().draw
                + "\t" + team.getValue().loss
                + "\t" + team.getValue().goalsScored
                + "\t" + team.getValue().goalsConceded
                + "\t" + team.getValue().goalDifference
                + "\t" + team.getValue().points);
    }
}

благодаря

Дейв

Редактировать:

Я думаю, что это как-то связано с этим кодом, поскольку я печатал записи в списке, и они не отсортированы:

    List list = new LinkedList(map.entrySet());
    // Defined Custom Comparator here
    Collections.sort(list, new Comparator() {
        public int compare(Object o1, Object o2) {

            System.out.println(((Comparable) ((Map.Entry) (o1)).getValue()).compareTo(((Map.Entry) (o2)).getValue()));
            return ((Comparable) ((Map.Entry) (o1)).getValue())
                    .compareTo(((Map.Entry) (o2)).getValue());          
        }
    });

Я изменил свой код на то, что я изначально разместил, и это не имело никакого отношения к LinkedList или LinkedHashMap, код действительно работал все время, он просто сортировался в порядке возрастания. Который для стола футбольной лиги, очевидно, неверен.

Редактировать:

Исправлено добавление * -1 показанное здесь:

return Integer.valueOf(this.won).compareTo(Integer.valueOf(other.won)) * -1;

Спасибо @Justin и @falsarella.

  • 1
    Вам действительно нужно использовать Generics !. Также посмотрите это, чтобы просмотреть итерацию карты с короткой версией.
  • 0
    Подсказка по устранению неполадок: напечатайте entry.getValue().won внутри for (Iterator it = list.iterator(); it.hasNext();) { итерация, чтобы мы могли видеть, является ли Collections.sort(list, new Comparator() { ... }); действительно отсортировал, изолировав проблему с определенной частью кода.
Показать ещё 5 комментариев
Теги:
oop
order
comparable
map

2 ответа

0
Лучший ответ

По-видимому, как комментировал @Justin, результат сортируется, но в восходящем порядке:

0, 1, 2, 3

Если вы хотите, чтобы в порядке потомков просто измените возвращаемый знак целого из метода compareTo:

return Integer.valueOf(this.won).compareTo(Integer.valueOf(other.won)) * -1; 
1

Я не думаю, что HashMap поддерживает порядок вставки. Попробуйте TreeMap. или LinkedHashmap, как было предложено компанией AVOLpe

http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

  • 0
    См. Stackoverflow.com/questions/3478061/…
  • 0
    ОП не сортировал HashMap . На самом деле, LinkedList был отсортирован.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню