2016-07-11 10 views
0

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?

+1

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). –

+0

@AndyTurner Das könnte das Fehlschlagen des Aufrufs von 'equals' erklären. Was ist mit 'compareTo'? –

+0

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. –

Antwort

2

equals nur nennen, wenn hashCode

Bitte überprüfen Sie diesen Code unterscheidet, ist es compareTo Aufruf

User user1 = new User(); 
     user1.setFirstName("testFirst"); 
     user1.setLastName("testLast"); 
     User user2 = new User(); 
     user2.setFirstName("testFirst1"); 
     user2.setLastName("testLast1"); 
     List<User> list = Arrays.asList(user1, user2); 
     Collections.sort(list); 

Ausgang: Vergleich .....

public class User implements Comparable<User> { 
    private String lastName; 
    private String firstName; 

    @Override 
    public int hashCode() { 
     System.out.println("hashCode....."); 
     int result = lastName.hashCode(); 
     result = 31 * result + firstName.hashCode(); 
     return result; 
    } 

    @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) { 
     System.out.println("equals....."); 
     if (this.firstName == ((User) o).getFirstName() && 
       this.lastName == ((User) o).getLastName()) { 
      return true; 
     } 
     return false; 
    } 



    public String getFirstName(){ 
     return firstName; 
    } 
    public String getLastName(){ 
     return lastName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

} 
+0

Ich bin mir nicht sicher warum, aber das hat nicht für mich funktioniert – SVN600