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.

Sie wirklich brauchen, verwenden Sie Generika!. Auch finden Sie unter this für wie zum Durchlaufen einer Karte mit einer kurzen version.
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

Schreibe einen Kommentar