Ich muss in der Lage sein, Benutzerobjekte basierend auf Vorname und Nachname zu sortieren. Um dies zu tun, überwog ich die compareTo()
Methode als Teil der Comparable
Schnittstelle. Wenn ich jedoch Collections.sort(users)
verwende, wobei users
eine ArrayList von User
Objekten ist, wird meine übergeordnete Implementierung von compareTo()
nie aufgerufen. Ähnlich übersteuerte ich equals()
, um auf Gleichheit der verschiedenen Felder in User
zu überprüfen; Name, Adresse, E-Mail-Adresse usw. Diese überlagerte Implementierung wird nie auch nur für users.remove(thisUser)
aufgerufen. Hier ist mein Code für die überschriebenen Methoden:Overriden Implementierungen von equals() und compareTo() nie aufgerufen
public class User implements Comparable<User> {
[other methods and fields go here]
@Override
public int compareTo(User aUser) {
System.out.println("Comparing.....");
return (this.lastName.compareTo(aUser.getLastName()) < 0 ? -1 :
this.lastName.compareTo(aUser.getLastName()) > 0 ? 1 :
this.firstName.compareTo(aUser.getFirstName()) < 0 ? -1 :
this.firstName.compareTo(aUser.getFirstName()) > 0 ? 1 : 0);
}
@Override
public boolean equals(Object o) {
if(this.firstName == ((User) o).getFirstName() &&
this.lastName == ((User) o).getLastName() &&
this.email == ((User) o).getEmail() &&
this.address == ((User) o).getAddress() &&
this.gender == ((User) o).getGender()) {
return true;
}
return false;
}
@Override
public int hashCode() {
return super.hashCode();
}
ich Einträge bin Hinzufügen einfach durch Aufruf: users.add(newUser)
, der gut arbeitet. Zum Beispiel werde ich "John Doe", "Bert S", "Al S" und "Steven X", und sie bleiben in der Reihenfolge ich sie in der Nachspiel hinzufügen
die Methoden aufrufen. Wenn ich schreibe die Einträge zurück in eine Datei, ich sortiere sie zuerst: Collections.sort(users);
Wenn ich einen Benutzer zu entfernen: users.remove(thisUser);
Sowohl das Hinzufügen, löschen und sortieren sind nur jeweils eine Zeile.
Warum wird keine dieser Methoden von users.remove()
oder Collections.sort()
aufgerufen?
Weil du hast "hashCode" .... nicht überschrieben? Nicht wirklich. Das ist der Grund, warum 'equals' nicht als' HashSet' bezeichnet wird. Wie bist du sicher, dass sie * nicht * genannt werden? (Aber Sie * sollten * sowieso 'hashCode' überschreiben). –
@AndyTurner Das könnte das Fehlschlagen des Aufrufs von 'equals' erklären. Was ist mit 'compareTo'? –
Bitte schreiben Sie einen Arbeitscode, der anzeigt, was Sie gerade erleben. Das Problem kann in der Art sein, wie Sie Dinge in die Liste setzen usw. –