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 would like to ask about some better way of writing the code above for a comparator exercise. The requirements are to handle null values in a way where two null values are equal and a null value is always smaller(in comparison) to a non null value.

This code is totally functional but it just seems to me abit sketchy. would like to hear some opinions and mind openers here :)

  • 1
    This question is more suitable for [code review](https://codereview.stackexchange.com/) – Guy Aug 23 '17 at 10:38
  • Also have a look into https://stackoverflow.com/questions/39804174/how-to-handle-null-compare-method-arguments-in-comparator – Girish007 Aug 23 '17 at 10:39

2 Answers2

0

You're almost there. Just some extra unnecessary checks can be removed.

Also there is no need to use else if because you are returning.

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());
}
OldCurmudgeon
  • 64,482
  • 16
  • 119
  • 213
0

You can't skip the comparison to null, you can either throw NullPointerException to inform that you don't compare nulls or maybe you can write some prittier code, this is very subjective eg:

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;
}

or in code golf style:

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;
}
Krzysztof Cichocki
  • 6,294
  • 1
  • 16
  • 32