I like the idea of having the functionality provided by
NullFirstComparator and NullLastComparator, but I have an
additional suggestion.
Currently, all of the classes in the comparators subpackage
are simple, and very useful. However, it seems that they'd
most often be used in conjunction with each other; typically,
I'd use ReverseComparator with ComparableComparator to get
reverse natural ordering, and I'd probably use a NullSomething
comparator with ComparableComparator to get natural ordering
that accepts nulls.
So my suggestion is, can we fold these all into one static
utility API? It would make them much more convenient, IMHO.
I'm thinking of something like:
public class ComparatorUtils {
// same as ComparableComparator.getInstance
public static Comparator NATURAL;
public static Comparator nullFirst(Comparator c);
public static Comparator nullLast(Comparator c);
// same as reverseComparator
public static Comparator reverse(Comparator c);
public static Comparator bean(Comparator c, String getterName);
public static Comparator transform(Comparator c, Transformer t);
}
Also, there are operations involving Comparators that I use
frequently that would be nice to have in the API:
public static Object min(Object o1, Object o2, Comparator c);
public static Object max(Object o1, Object o2, Comparator c);
which would return the higher or lower of the given objects
according to the comparator.
Any of this make sense?
-Paul
> -----Original Message-----
> From: Michael A. Smith [mailto:[EMAIL PROTECTED]]
> Sent: Friday, June 07, 2002 1:00 PM
> To: Jakarta Commons Developers List
> Subject: RE: [Collections] ComparableComparator - nulls OK
>
>
> On Fri, 7 Jun 2002, Eric Pugh wrote:
> > +1, In my sorts, having to deal with nulls is causing me
> difficulties as
> > well.. Although I could see something like any nulls being
> ignored as a
> > type of behavior.. Sort everything, and drop the nulls!
>
> consider: Comparator.compare(null, "x");
>
> how do you drop or ignore the null when doing this compare?
>
>
> > -----Original Message-----
> > From: Jonathan Carlson [mailto:[EMAIL PROTECTED]]
> > Sent: Friday, June 07, 2002 3:38 PM
> > To: [EMAIL PROTECTED]
> > Subject: [Collections] ComparableComparator - nulls OK
> >
> >
> > I'd like to make the case for a ComparableComparator that
> > allows the sorting of nulls to the bottom. This could be a
> > flag to set on the existing class or another Comparator
> > called something like NullableComparableComparator (or
> > ComparableNullComparator?).
>
> How about something like this:
>
> public class NullFirstComparator implements Comparator {
> private Comparator c;
> public NullFirstComparator(Comparator nonNullComparator) {
> this.c = nonNullComparator;
> }
> public int compare(Object a, Object b) {
> if(a == b) return 0;
> if(a == null) return -1;
> if(b == null) return 1;
> return c.compare(a,b);
> }
> }
>
> and
>
> public class NullLastComparator implements Comparator {
> private Comparator c;
> public NullLastComparator(Comparator nonNullComparator) {
> this.c = nonNullComparator;
> }
> public int compare(Object a, Object b) {
> if(a == b) return 0;
> if(a == null) return 1;
> if(b == null) return -1;
> return c.compare(a,b);
> }
> }
>
>
> That allows you to adjust the behavior of comparison to null for any
> comparator and not just the ComparableComparator. It sounds like in
> your case (sorting nulls last using ComparableComparator), you'd use:
>
> new NullLastComparator(ComparableComparator.getInstance())
>
>
> If that sounds reasonable, I'll add a full implementation
> (with a better
> "Comparator.equals" method) to the list of things on my todo list.
>
> regards,
> michael
>
> p.s. I just threw together the above implementations. I
> wouldn't trust
> it to actually sort things properly (or even compile) -- I may have
> things reversed or something where nulls go first instead of last and
> vice-versa.
>
>
> --
> To unsubscribe, e-mail:
> <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
> <mailto:[EMAIL PROTECTED]>
>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>