2017-01-27 4 views
1

Ok, ich bin irgendwie in der Verlust hier aber hier geht. Also muss ich den Array-Medallisten sortieren, wenn sie ausgedruckt werden. Zuerst muss ich nach Gold-Medaillen sortieren, die zum Index [0] hinzugefügt werden, zweitens nach Silber im Index [1], dritten nach Bronze im Index [2] und zuletzt, wenn ein Team gebunden ist, werden sie nach Team-Namen sortiert. Muss ich eine Sortiermethode in einer anderen Klasse aufrufen, diese verfolgen und mit den anderen Teams vergleichen und vergleichen, und wenn sie am besten sind, sie zuerst ausdrucken?Vergleichen Integer, Arrays von Klasseninstanzen

Wie kann ich Integer in einem Array von Klassen mit einem anderen vergleichen?

Wenn ein Benutzer einen bestimmten Befehl eingibt, wird eine Liste von Teams mit ihren Ergebnissen ausgedruckt.

Ab jetzt sieht es wie folgt aus:

1st 2nd 3rd Team Name 
0 0  0  North Korea 
3 1  1  America 
5 0  2  France 
2 1  3  Germany 

ich es sagen will:

1st 2nd 3rd Team Name 
5 0  2 France 
3 1  1 America 
2 1  3 Germany 
0 0  0 North Korea 
import java.util.ArrayList; 
import java.util.Arrays; 

public class Team { 
    private String teamName; 
    private ArrayList<Participant> participantList = new ArrayList<Participant>(); 
    private int[] medalList = new int[3]; 

    public Team(String teamName) { 
     this.teamName = teamName; 
    } 

    public String getTeamName() { 
     return teamName; 
    } 

    public void addParticipant(Participant participant) { 
     participantList.add(participant); 
    } 

    public void removeFromTeam(int participantNr){ 
     for(int i = 0; i < participantList.size(); i++){ 
      if(participantList.get(i).getParticipantNr() == participantNr){ 
       participantList.remove(i); 
      } 
     } 
    } 

    public void printOutParticipant() { 
     for(int i = 0; i < participantList.size(); i++){ 
      System.out.println(participantList.get(i).getName() + " " + participantList.get(i).getLastName()); 
     } 
    } 

    public boolean isEmpty() { 
     boolean empty = false; 
     if (participantList.size() == 0) { 
      empty = true; 
      return empty; 
     } 
     return empty; 
    } 

    public void emptyMedalList(){ 
     Arrays.fill(medalList, 0); 
    } 

    public void recieveMedals(int medal) { 
     if(medal == 1){ 
      int gold = 0; 
      gold = medalList[0]; 
      medalList[0] = ++gold; 
     } else if (medal == 2){ 
      int silver = 0; 
      silver = medalList[1]; 
      medalList[1] = ++silver; 
     } else if (medal == 3){ 
      int bronze = 0; 
      bronze = medalList[2]; 
      medalList[2] = ++bronze; 
     } 
    } 

    public void printMedals(){ 
     System.out.println(medalList[0] + " " + medalList[1] + " " + medalList[2] + " " + teamName); 
    } 

    public int compareTo(Team team) { 
    int goldDif = Integer.compare(team.medalList[0], this.medalList[0]); 
    if (goldDif != 0) 
      return goldDif; 
    int silverDif = Integer.compare(team.medalList[1], this.medalList[1]); 
    if (silverDif != 0) 
     return silverDif; 
    int bronzeDif = Integer.compare(team.medalList[2], this.medalList[2]); 
    if (bronzeDif != 0) 
     return bronzeDif; 
    return this.getTeamName().compareTo(team.getTeamName()); 
} 

    public String toString() { 
     return teamName; 
    } 

} 
+1

I‘ Tut mir leid, du hast eine Frage, die keinen Sinn ergibt. Können Sie uns ein Beispiel geben, dem wir folgen können? –

+1

Zeigen Sie den Code, den Sie sortieren möchten. Außerdem müsstest du 'medalList' in irgendeiner Form anzeigen, wenn du außerhalb dieser Klasse sortieren möchtest. – shmosel

+0

Ich hatte keine Zeit zum Bearbeiten, ich sollte es so eingeben. Oh Entschuldigung, ich tippte während ich versuchte den Code herauszufinden. Hätte mehr Zeit brauchen, um eine richtige Frage zu stellen. Wenn ein Benutzer einen bestimmten Befehl eingibt, wird eine Liste von Teams mit ihren Ergebnissen ausgedruckt. Ab jetzt sieht es wie folgt aus: http://i.imgur.com/sJQpgsQ.png ich es sagen will: http://i.imgur.com/bB9gha0.png –

Antwort

1

Machen Sie Ihre Team-Klasse vergleichbar

public class Team implements Comparable<Team> { 

und fügen Sie ein Vergleichsmethode

@Override 
public int compareTo(final Team other) { 
    for (int i = 0; i < 3; i++) { 
     final int compareMedals = Integer.compare(medalList[i], other.medalList[i]) 
     if (compareMedals != 0) { 
      return compareMedals; 
     } 
    } 
    return teamName.compareTo(other.teamName); 
} 

Dies wird Goldmedaillen zuerst überprüfen, dann Silbermedaillen, wenn die Anzahl der Goldmedaillen gleich ist und so weiter und den Teamnamenvergleich als letztes Mittel verwenden. Anschließend können Sie eine Sammlung von Team s mit

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

EDIT sortieren:

Oder wenn Sie es in Java 8 Stil mögen könnten Sie auch Ihre Vergleichsmethode schreiben wie

@Override 
public int compareTo(final Team other) { 
    return Stream.of(0, 1, 2) 
       .map(i -> Integer.compare(medalList[i], other.medalList[i])) 
       .filter(i -> i != 0) 
       .findFirst() 
       .orElse(teamName.compareTo(other.teamName)); 
} 
+0

1. Warum magst du 'final' so sehr? Eine gute Praxis, die mir nicht bekannt ist? –

+0

Sie können http://stackoverflow.com/questions/500508/why-should-i-use-the-keyword-final-on-a-method-parameter-in-java für Anfänger lesen. Kurz gesagt, es ist eine gute Übung, alles "final" zu machen, es sei denn, Sie brauchen es wirklich neu zuzuweisen. Dies gilt insbesondere für Methodenparameter in Java. –

+1

Hört sich eher nach Geschmack als nach guter Praxis an. –