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
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)). –
Viele gute Informationen hier: http://stackoverflow.com/questions/369512/how-to-compare-objects-by-multiple-fields – Marichyasana