Re: how to return Comparator values
"Thufir" wrote ...
Just trying to learn how Comparator works.
Looking at:
<snip code/>
static final Comparator<Employee> SENIORITY_ORDER =
new Comparator<Employee>() {
public int compare(Employee e1, Employee e2) {
return e2.hireDate().compareTo(e1.hireDate());
}
....
However, how or where is SENIORITY_ORDER ranking defined? I guess
it's in
return e2.hireDate().compareTo(e1.hireDate()); //neg, zero, pos
which returns either a negative, positive or zero. We're only
interested in negative results?
Matt Humphrey wrote:
Of course, you should read the Javadocs for the Comparator interface, but in
Hear! Hear!
<http://java.sun.com/javase/6/docs/api/java/util/Comparator.html>
a nutshell, the compare (a, b) function returns the relative order of the
two items.
If a < b, it should return -1
if a > b it should return +1
if a.equals(b) it should 0
It's up to you to define what "<" means by looking at your own data. The
compareTo function of Comparables (Strings, Numbers, etc all implement
Comparable) uses the same definition, but you can prioritize the data as you
see fit to determine how you want the order.
Example: suppose you have an entity class (simplified):
public class Person
{
private String name;
private Double age;
public void setName( String n ) { name = n; }
public String getName() { return name; }
public void setAge( Double a ) { age = a; }
public Double getAge() { return age; }
}
Sometimes you want to sort by name, sometimes by age, sometimes by first one
then the other.
Here's a sample Comparator for age:
Comparator <Person> personAgeComparator = new Comparator <Person> ()
{
public int compare( Person lef, Person rig )
{
if ( lef == null ) { return (rig == null? 0 : -1); }
if ( rig == null ) { return 1; }
if ( lef.getAge() == null ) { return (rig.getAge() == null? 0 : -1 }
if ( rig.getAge() == null ) { return 1; }
return lef.getAge().compareTo( rig.getAge() );
}
}
A more realistic example would use birthdates, which don't change as
continuously as age does.
A name Comparator would be similar, but use a different implementation of the
compare() method, one based on getName() instead of getAge()
One could easily write a Comparator that sorts by age first, then name (or
vice versa).
If a Comparator were to be widely re-used, you'd consider making it a
top-level class:
class PersonAgeComparator implements Comparator <Person>
{
public int compare( Person lef, Person rig )
{
// etc.
}
}
--
Lew