2016-10-15 1 views
0

Gut Day-Arbeiten mit Vergleicher <T>

ich an einer Aufgabe arbeiten, in dem ich Richtlinien habe eine Methode wie void sortByAthleteNames() genannt zu schaffen, die die folgende Aufgabe tun:

Sortieren Sie die Liste der Athletenobjekte mit Vor- und Nachnamen. Diese Methode ruft die Sortiermethode in der Sortierungen Klasse definiert, ein Objekt von AthleteNameComparator Klasse als zweiten Parameter mit

Sortierungen Klasse hat die folgende Umsetzung:

public class Sorts { 

    public static void sort(ArrayList<Athlete> objects,Comparator<Athlete> comparator) 
    { 
     //TODO 
    } 
} 

Ihre Sortiermethode nutzt das Vergleichen Methode des Parameters Comparator-Objekt zum Sortieren. Sie können eine der Optionen Auswahl sortieren oder Einfügen sortieren verwenden.

sortByAthleteNames() Methode Implementierung:

Die AthleteNameComparator Klasse implementiert die "Komparator" interface:

public void sortByAthleteNames() { 
     AthleteNameComparator athleteNameComparator = new AthleteNameComparator();  
     Sorts.sort(athleteList, **CONFUSED WHAT TO PASS HERE**); 
    } 

während AthleteNameComparator Klasse die folgenden Richtlinien hat. Es muss die folgende Methode definieren, die eine geerbte abstrakte Methode von Komparator-Schnittstelle war:

public int vergleichen (Object erste, Object Sekunde) (Beachten Sie, dass Sie auch festlegen können: erste public int vergleichen (Athlete , Athlet Sekunde) stattdessen durch die Klasse machen implementiert Vergleicher

Dafür habe ich eine Klasse geschaffen, die wie folgt lautet:.

AthleteNameComparator

public class AthleteNameComparator implements Comparator<Athlete>{ 

    @Override 
    public int compare(Athlete o1, Athlete o2) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 

Darüber hinaus haben wir die folgenden Richtlinien, die wir brauchen, diese in der gleichen Methode zu implementieren und diese sind wie folgt:

Wenn das erste Argument Objekt einen Nachnamen hat lexikographisch kleiner als die von der zweites Argument wird ein int kleiner als null zurückgegeben. Wenn das erste Argument-Objekt einen Nachnamen hat, der lexikographisch größer ist als der des zweiten Arguments, wird ein int größer als Null zurückgegeben. Wenn ihre Nachnamen gleich sind, sollten ihre Vornamen verglichen werden. Wenn sie denselben Vor- und Nachnamen haben, sollte 0 zurückgegeben werden.

Ich bin hier verwirrt. Meine Frage ist, wie kann ich eine relationale Operatoren durchführen, weil die datatype des lastName ist String und zurückgegeben -1/1 oder 0. Ich habe viel gesucht und nach meinem Verständnis, das ist, wie ich diese vergleichen kann. Bitte bestätigen Sie, dass dies der richtige Weg ist, dies zu tun?

public class AthleteNameComparator{ 

    public int compare(Athlete a1, Athlete a2) { 

     if(a1.getLastName().hashCode() < a2.getLastName().hashCode()) 
     { 
      return -1; 
     } 
     else if(a1.getLastName().hashCode() > a2.getLastName().hashCode()) 
     { 
      return 1; 
     } 
     else if(a1.getLastName().hashCode() == a2.getLastName().hashCode()) 
     { 
      if(a1.getFirstName().hashCode() == a2.getFirstName().hashCode()) 
      { 
       return 0; 
      } 
     } 
     return 100; 
    } 
} 

Aber nochmal, warum machen wir das? Was würden wir mit -1/1 oder 0 erreichen? Könnten Sie bitte auch erklären, wie das funktioniert?Auf welche Dinge muss ich zuerst achten und wenn ich die erfolgreiche Antwort von der compare() Methode bekomme, wie könnte ich den zurückgegebenen Wert in Insertion oder Selection sort verwenden.

Vielen Dank

+2

Verwenden Sie nicht 'hashCode'. Es garantiert nicht lexikografische (oder irgendeine) Ordnung. Verwenden Sie stattdessen [String.compareTo] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo (java.lang.String)). –

+0

Viele gute Informationen hier: http://stackoverflow.com/questions/369512/how-to-compare-objects-by-multiple-fields – Marichyasana

Antwort

1

Sortierung mit Komparatoren ein Standard, was in Java zu tun ist. Für wie es funktioniert und warum die Methode compare einen negativen/positiven/0-Wert zurückgeben muss, finden Sie die Lernprogramme und andere Ressourcen im Internet und/oder in Ihrem Lehrbuch.

Es ist wirklich albern, einen bestimmten Klassennamen zu verlangen, wie AthleteNameComparator, aber vorausgesetzt, es ist eine Schulaufgabe, sollten Sie wahrscheinlich damit gehen.

Der Aufruf zu sortieren ist einfach:

Sorts.sort(athleteList, athleteNameComparator); // **SEE WHAT TO PASS HERE** 

Ihr Skelett für AthleteNameComparator korrekt ist.

@Override 
public int compare(Athlete o1, Athlete o2) { 
    int diffLastName = o1.getLastName().compareTo(o2.getLastName()); 
    if (diffLastName == 0) { // last names are equal 
     return o1.getFirstName().compareTo(o2.getFirstName()); 
    } else { 
     return diffLastName; 
    } 
} 

Sobald Sie den Dreh raus zu bekommen, Komparatoren Schreiben ist einfach: Sie können wie bei dem Verfahren füllen Sie einfach passieren (Delegierte) die Aufgabe, an die entsprechende compareTo (seltener zu anderen compare Methode des Komparator), und es wird den korrekten negativen oder positiven oder 0-Wert zurückgeben. Sie müssen nicht einmal im Auge behalten, welches ist, solange Sie die linke Seite (o1) und die rechte Seite (o2) an ihren richtigen Stellen halten.

Wenn es nicht für die Anforderung auf den Namen der Klasse war, sortByAthleteNames() konnte mit nur wenigen Zeilen Code einschließlich der Komparator geschrieben werden (vorausgesetzt, Java 8):

public void sortByAthleteNames() { 
    Sorts.sort(athleteList, Comparator.comparing(Athlete::getLastName).thenComparing(Athlete::getFirstName)); 
} 

Wenn ich richtig verstehe, Sie Den größten Teil der Arbeit haben Sie noch vor sich: Implementierung . Wenn Sie von einem Sortieralgorithmus ausgehen, der Elemente mit beispielsweise vergleicht, müssen Sie es durch comparator.compare(e1, e2) < 0 ersetzen. Verwenden Sie immer denselben relationalen Operator wie den ursprünglichen Algorithmus und es sollte reibungslos funktionieren.

Ich hoffe, es hilft.

Verwandte Themen