Wie zu verwenden vergleichbare hashmap der Klasse object Eigenschaft
Ich habe eine Fußball-Tabelle, die ich versuche zu Sortieren Spiele gewonnen.
Ich habe eine Klasse, die vergleichbar und schaut auf die gewonnen Eigentum. Dies scheint den richtigen Wert zurück (1, -1 oder 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));
}
}
Diese Art der Funktion zurückgeben sollte eine hashmap sortiert. Die hashmap hat die Teamnamen als Schlüssel und einer Instanz des teamstandings-Klasse als Wert.
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;
}
Die hashmap sortedtable, nimmt eine Zeichenfolge für den Namen des Teams und eine teamstandings Klasse-Objekt, das enthält die Spiele gewonnen, verloren, etc.
Aus irgendeinem Grund kann ich nicht bekommen, die Tabelle zu Sortieren. Bleibt er einfach in unsortierter Reihenfolge.
Ich glaube, es ist etwas zu tun mit der sortbyvalues Funktion bei der Sammlung.Art position.
Irgendwelche Ideen, wie ich das gewonnen Wert in meiner Klasse zum Sortieren der hashmap?
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);
}
}
Dank
Dave
Edit:
Ich denke, dass es etwas zu tun mit diesem code, wie ich gedruckte Einträge in der Liste und Sie sind nicht sortiert:
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());
}
});
Änderte ich meinen code zurück auf das, was ich ursprünglich geschrieben und es gab nichts zu tun, mit LinkedList oder LinkedHashMap, den code tatsächlich arbeiteten alle zusammen, es wurde nur die Sortierung in aufsteigender Reihenfolge. Was für eine Fußball-Liga Tabelle ist offensichtlich nicht korrekt.
Edit:
Dem Update wurde das hinzufügen der * -1
hier gezeigt:
return Integer.valueOf(this.won).compareTo(Integer.valueOf(other.won)) * -1;
Danke an @Justin und @falsarella.
Fehlerbehebung Hinweis: drucken
entry.getValue().won
innerhalb der for (Iterator it = list.iterator(); it.hasNext();) {
iteration, so können wir sehen, ob die Collections.sort(list, new Comparator() { ... });
hatte wirklich sortiert, isolieren Sie das problem auf einen bestimmten Teil des Codes.Nein, es hat nicht sortiert Gewonnen: 0 Gewonnen: 1 Gewonnen: 2 Gewonnen: 3 Gruppe: Ein Team MP W D L GS GC GD P Brasilien 3 0 0 3 0 3 -3 0 Italien 3 1 0 2 1 2 -1 3 Deutschland 3 2 0 1 2 2 0 6 England 3 3 0 0 4 0 4 9
Das ist sortiert vom kleinsten zum größten integer
sind Sie sicher, dass Sie das println in der
for (Iterator it = list.iterator(); it.hasNext();) {
und nicht in Collections.sort(list, new Comparator() { ... });
? Die Saiten von der print innerhalb der Collections.sort
offensichtlich nicht sortiert werden: das ist, warum Sie sollten prüfen, die Drucke nach der list
war komplett sortiert.
InformationsquelleAutor Dave Nicholls | 2014-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Offenbar, wie @Justin kommentierte, die Ausgabe ist sortiert, aber in Aszendent Reihenfolge:
Wenn Sie wollen, dass in Nachkomme bestellen, ändern Sie einfach die zurückgegebene Ganzzahl Zeichen der
compareTo
Methode:InformationsquelleAutor falsarella
Ich glaube nicht, dass eine HashMap verwaltet insertion um. Versuchen Sie eine TreeMap. oder LinkedHashmap, wie vorgeschlagen, durch AVolpe
http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html
Die OP hat nicht Sortieren
HashMap
. Eigentlich einLinkedList
sortiert wurde.Und nach der Art der
LinkedList
er das Ergebnis einerLinkedHashMap
, und dann wieder die neueste Karte.Ja, aber ich glaube nicht, dass eine HashMap verwaltet insertion um. Ich verdeutlichte meine post
Du hast Recht, sorry. Ich werde versuchen, und denken Sie über meine Antworten besser in die Zukunft.
InformationsquelleAutor Justin