У меня есть футбольный стол, который я пытаюсь сортировать по выигранным играм.
У меня есть класс, который реализует сопоставимые и смотрит на свойство 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.
По-видимому, как комментировал @Justin, результат сортируется, но в восходящем порядке:
0, 1, 2, 3
Если вы хотите, чтобы в порядке потомков просто измените возвращаемый знак целого из метода compareTo
:
return Integer.valueOf(this.won).compareTo(Integer.valueOf(other.won)) * -1;
Я не думаю, что HashMap поддерживает порядок вставки. Попробуйте TreeMap. или LinkedHashmap, как было предложено компанией AVOLpe
http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html
HashMap
. На самом деле, LinkedList
был отсортирован.
entry.getValue().won
внутриfor (Iterator it = list.iterator(); it.hasNext();) {
итерация, чтобы мы могли видеть, является лиCollections.sort(list, new Comparator() { ... });
действительно отсортировал, изолировав проблему с определенной частью кода.