2017-08-23 3 views
0
public int compare(Event e1, Event e2) { 
    if (e1 == null && e2 == null) { 
     return 0; 
    } else if (e1 == null && e2 != null) { 
     return -1; 
    } else if (e1 != null && e2 == null) { 
     return 1; 
    } else if (e1.getDate() == null && e2.getDate() == null) { 
     return 0; 
    } else if (e1.getDate() == null && e2.getDate() != null) { 
     return -1; 
    } else if (e1.getDate() != null && e2.getDate() == null) { 
     return 1; 
    } else 
     return e1.getDate().compareTo(e2.getDate()); 
} 

Hey aimerait poser une question sur une meilleure façon d'écrire le code ci-dessus pour un exercice de comparaison. Les exigences sont de gérer les valeurs nulles d'une manière où deux valeurs nulles sont égales et une valeur nulle est toujours inférieure (en comparaison) à une valeur non nulle.Java personnalisé comparer méthode des objets et des dates

Ce code est totalement fonctionnel mais il me semble que ce soit un peu sommaire. aimerait entendre des opinions et des ouvertures d'esprit ici :)

+1

Cette question est plus approprié pour [la révision du code] (https://codereview.stackexchange.com/) – Guy

+0

également un coup d'oeil dans https://stackoverflow.com/que stions/39804174/comment-gérer-null-comparer-méthode-arguments-dans-comparateur – Girish007

Répondre

0

Vous êtes presque là. Juste quelques contrôles supplémentaires inutiles peuvent être supprimés.

De même, il n'est pas nécessaire d'utiliser else if car vous êtes return ing.

public int compare(Event e1, Event e2) { 
    // nulls are equal 
    if (e1 == null && e2 == null) { 
     return 0; 
    } 
    // A null is always less than anything. 
    if (e1 == null) { 
     return -1; 
    } 
    if (e2 == null) { 
     return 1; 
    } 
    // null dates are equal 
    if (e1.getDate() == null && e2.getDate() == null) { 
     return 0; 
    } 
    // A null is always less than anything. 
    if (e1.getDate() == null) { 
     return -1; 
    } 
    if (e2.getDate() == null) { 
     return 1; 
    } 
    // All present - use normal date comparison. 
    return e1.getDate().compareTo(e2.getDate()); 
} 
0

Vous ne pouvez pas ignorer la comparaison null, vous pouvez jeter NullPointerException informer que vous ne comparez pas les valeurs NULL ou vous pouvez peut-être écrire un code de prittier, ce qui est très subjective par exemple:

public int compare(Event e1, Event e2) { 
    if (e1 == null) return -compareToNull(e2); 
    if (e2 == null) return compareToNull(e1); 
    if (e1.getDate() == null) return -compareToNull(e2.getDate());  
    if (e2.getDate() == null) return compareToNull(e1.getDate()); 
    return e1.getDate().compareTo(e2.getDate()); 
} 

private int compareToNull(Object e) { 
    return e == null ? 0 : 1; 
} 

ou dans le style de golf de code:

public int compare(Event e1, Event e2) { 
    if (e1 == null || e2 == null) return compareNull(e1, e2); 
    if (e1.getDate() == null || e2.getDate() == null) return compareNull(e1.getDate(), e2.getDate()); 
    return e1.getDate().compareTo(e2.getDate()); 
} 

private int compareNull(Object e1, Object e2) { 
    return e1 == null && e2 == null ? 0 : e2 == null ? 1 : -1; 
}