2017-12-24 8 views
0

Ich mache ein Java-Projekt, das Fußballspiele aufzeichnet und die Rangliste anzeigt. Wenn ein Spiel zwischen zwei Teams in die Liga aufgenommen wird, muss ich die Position des Teams in der Liga speichern, basierend auf der Anzahl der Punkte, die das Team hat.Sortierung einer HashMap oder TreeMap nach Wert

Um dies zu tun, denke ich an die Verwendung einer HashMap < Integer, Team> wo der Integer die Position des Teams in der Liga basierend auf der Anzahl der Punkte speichert, die ein Team hat. Immer wenn ein neues Spiel hinzugefügt wird, muss ich diese Liste so sortieren, dass sie sortiert ist, wo die Teams mit der größten Anzahl von Punkten näher an der ersten Position sind.

Zum Beispiel, wenn es drei Teams

Team A mit 8 Punkten, Team B mit 5 Punkten, Team C mit 4-Punkt-

ich die Karte möchte als solche

bestellt werden

1: A, 2: B, 3: C

Fragen sind:

1) Denkst du, ich sollte eine HashMap oder TreeMap für diese Instanz verwenden?

2) Wie würde ich den Code implementieren, um die Liga nach Punkten zu sortieren?

+0

Würde das nicht brechen, wenn zwei Teames an der gleichen Stelle sind? – baao

+0

Ja würde es aber dann würde ich auch gerne den Tordifferenz, die die beiden Teams haben, abräumen. Sagen Sie zum Beispiel, Team A hat 3 Punkte und Team B hat 3 Punkte. Wenn die Tordifferenz von Team A 3 ist und die Tordifferenz von Team B 5 beträgt, sollte Team B eine größere Position in der Liga haben. –

+0

Auch wenn der Tordifferenz gleich ist, dann sollte es gehen, wer die meisten Ziele hat. Wenn das gleich ist, bin ich nicht sicher, ob es wichtig ist, in welcher Reihenfolge sie sind. –

Antwort

2

Eine List ist besser für Ihren Anwendungsfall geeignet. Es bietet Ihnen eine schnelle und einfache Sortierung. Darüber hinaus ist es für geordnete Darstellung von Werten wie in einer Tabelle besser geeignet ist, usw.

Ich würde das Team Objekt vergleichbar machen, eine Array-Liste verwenden, dann würde ich tun:

public class Team implements Comparable<Team> { 
    private int points; 
    private int goalDifference; 

    public Team(int points, int goalDifference) { 
     this.points = points; 
     this.goalDifference = goalDifference; 
    } 

    @Override 
    public int compareTo(Team other) { 
     int res = other.points - this.points; 
     return res != 0 ? res : (other.goalDifference - this.goalDifference); 
    } 

    //getters and setters 
} 

Mit eine vergleichbare Team Klasse, können Sie die Liste Funktionen verwenden:

List<Team> teams = ... 
Collections.sort(teams); 

Wenn Sie nicht vergleichbar der Team Klasse machen möchten, können Sie einen Komparator verwenden (das snippet oben fortfahrend):

teams.sort((team1, team2) -> 
    (team2.getPoints() != team1.getPoints()) ? 
    (team2.getPoints() - team1.getPoints()) : 
    (team2.getGoalDifference() - team1.getGoalDifference()) 
    ); 

Beachten Sie, dass die Logik in absteigender Reihenfolge in Vergleicher oder Komparatoren implementiert wurde. Sie können stattdessen den Rückwärtskomparator verwenden.

Die Option zur Implementierung von Comparator wird mehr und mehr bevorzugt, wenn die Anzahl der Vergleichsfelder wächst. Ich persönlich würde das bevorzugen, da es lesbarer ist.

+0

Danke, würden Sie wissen, wie man diese Antwort erweitert? Ich muss auch eine zweite Variable in Team - Tordifferenz bestellen, wenn zwei Teams die gleiche Anzahl an Punkten haben. –

+0

Hinzugefügt goalDifference –

+0

Brilliant es funktioniert, vielen Dank. –

0

Für Nummer eins würde ich empfehlen, eine Karte zu verwenden, um den Rang im Team-Objekt zu speichern, dies würde es leichter machen zu verifizieren, dass es nicht zwei Teams mit doppelten Rankings gibt. Für die Nummer zwei können Sie eine Klasse schreiben, die die Comparator Schnittstelle implementiert. Sie müssen die Methode compare implementieren, bei der Sie zwei Objekte (in diesem Fall Teams) vergleichen und eine negative, null oder positive Zahl zurückgeben, wenn das erste Objekt kleiner, gleich oder größer als das zweite Objekt ist. Dazu müssten Sie die Implementierung der Karte von HashMap zu TreeMap ändern.

Verwandte Themen