Komparator - dane osób

0

Hej.
Nie mam pojęcia jak napisać komparator o który mi chodzi więc zwracam się tutaj z prośbą o dość znaczną pomoc. Otóż komparator ten powinien porównywać osoby (każda osoba: imię, nazwisko, data urodzenia) wg nazwiska (w przypadku tego samego nazwiska wg imienia, a w przypadku tego samego imienia wg daty urodzenia.
np

Karolak Zbigniew 23/01/1990
Kieroński Piotr 10/05/1999
Kieroński Piotr 01/01/2001
Kieroński Stefan 05/05/1905

Klasę osoba mam, jest tam Stringowe imie, nazwisko i data urodzenia. Choć nie wiem czy nie lepiej byłoby jakoś inaczej datę urodzenia przechowywać, bo przecież powinna ona być porównywana. Proszę o kod tego komparatora, jak to zrealizować... ?

0

Proponuje zajrzeć do dokumentacji, a w szczególności metodzie stringa: compareTo
a dziś będe świętym mikołajem ;] np.
jako metoda statyczna

public boolean comparePersons(Person osoba1, Person osoba2){
if(osoba1.getSurname().compareTo(osoba2.getSurname()) != 0)
 if(osoba1.getName().compareTo(osoba2.getName()) != 0)
  if(osoba1.getBirthDate().compareTo(osoba2.getBirthDate()) != 0)
   return true;
return false;
}

lub lepiej jako metoda obiektu

public boolean comparePersons(Person osoba){
if(this.getSurname().compareTo(osoba.getSurname()) != 0)
 if(this.getName().compareTo(osoba.getName()) != 0)
  if(this.getBirthDate().compareTo(osoba.getBirthDate()) != 0)
   return true;
return false;
}

jak chcesz proownywac czy data jest taka sama to co za różnica czy syring czy nie, bo jak bedzie taki sam to i stringi oba beda sobie rowne ale ja i tak ze względów praktycznych proponowałbym obiekt typu Date, ma też metodę compareTo()

pozdrawiam

0

Interfejs Comparable trzeba by zaimplementować... ale to jest banalnie proste. Szczególnie że klasa String ma już go zaimplementowanego i trzeba tylko na kolejnych polach uruchamiać metodę compareTo().
Co do daty urodzenia polecam trzymanie jej jako pola Long i za pomocą narzędzi z klasy Date zamienianie tej wartości (podanej w milisekundach) na różne potrzebne aktualnie formaty.

0

To co napisał freakman69 przypomina equals() a nie compareTo()

http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html
http://java.sun.com/javase/6/docs/api/java/util/Comparator.html

Metoda ta musi zwraca liczbę, a nie wartość boolowską.

public class Person implements Comparable<Person>{
(...)
  public int compareTo(Person osoba2) {
        int ret = this.getSurname().compareTo(osoba2.getSurname());
        if (ret != 0) return ret;
        ret = this.getName.compareTo(osoba2.getName());
        if (ret != 0) return ret;
        return this.getBirthDate().compareTo(osoba2.getBirthDate());
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1