CompareTo z nullami na końcu

CompareTo z nullami na końcu
HE
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Kraków
  • Postów:233
0

Mam problem z metodą compareTo, chodzi o to, że mogą się pojawić nulle a te mają być na końcu. Analogicznie do order by ... nulls last. Proszę o pomoc bo albo mam gdzieś jeszcze coś źle albo to ta metoda, wyglądała tak a muszę zrobić, żeby nulle szły ostatnio i coś mi nie wychodzi.

Kopiuj
  
@Override
    public int compareTo(Object o) {
        if( getParam() == null) {
            return -1;
        }
        if ( o.getParam() == null ) {
            return 1;
        }
        return getParam().getDescription().compareTo(o.getParam().getDescription());
    }
edytowany 1x, ostatnio: Hepek
szweszwe
Ten pierwszy getParam() to bez żadnego obiektu?
HE
z tego co wiem tam można dać this. ale tak też powinno być dobrze
Koziołek
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:dzień
  • Lokalizacja:Stacktrace
  • Postów:6822
1
  1. Nie masz rzutowania o na typ w ramach którego jest metoda.
  2. compareTo jest generyczna po to by nie musieć używać Object i rzutowania
  3. jeżeli getDescription zwróci null dla parametru do którego referencję trzyma obiekt na którym wywołujesz metodę to dostaniesz NPE.

A teraz co do implementacji:

Kopiuj
public int compateTo(TwojaKlasaWKtorejSiedziTaMetoda o){
   if(o==null || o.getParam() == null )
     return 1; // jesteśmy > niż null
   if(getParam()==null || getParam().getDescription()==null)
     return -1; // jesteśmy nullem i tym samym jesteśmy mniejsi
   return getParam().getDescription().compareTo(o.getParam().getDescription());
}

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
HE
właśnie chodzi o to, że description też może być nullem i żeby wtedy ustawiało te nulle na końcu, nie da się uchronić od NPE?
Koziołek
to tak jak ci napisałem. Jeżeli this.param.description jest null to zwracasz -1. Jeżeli nullem jest ten z o to obsługujesz na poziomie komparatora w description
HE
niestety, dalej dostaje NPE
Koziołek
w którym dokładnie miejscu
HE
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Kraków
  • Postów:233
0

Poradziłem sobie w ten sposób:

Kopiuj
public int compareTo(ObiektKlasy... o) {
   
         if( getParam().getDescription() == null) {
            return 1;
        }
        if ( o.getParam().getDescription() == null ) {
            return -1;
        }
        
        if(getParam().getDescription() == null && o.getParam().getDescription() == null)
            return 0;
        else if(getParam().getDescription() > o.getParam().getDescription())
            return 1;
        else if(getParam().getDescription() < o.getParam().getDescription())
            return -1;

        return getParam().getDescription().compareTo(o.getParam().getDescription());
 
    }
Zobacz pozostały 1 komentarz
HE
Chyba nie występuje taki przypadek, aczkolwiek - wystarczy dodać w pierwszym if( ... || getParam() == null ) i analogicznie w drugim?
Koziołek
najpierw sprawdź getParam
HE
w sensie czy występuje przypadek z nullem?
HE
Nie występuje taki przypadek, ale zastanowie się czy to dodać bo może się przydać w przyszłości. Dzięki za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.