Re: how to return Comparator values
- From: Lew <lew@xxxxxxxxxxxxx>
- Date: Sat, 26 Apr 2008 22:27:32 -0400
"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
.
- References:
- how to return Comparator values
- From: Thufir
- Re: how to return Comparator values
- From: Matt Humphrey
- how to return Comparator values
- Prev by Date: Re: how to return Comparator values
- Next by Date: Re: How to include *.class file with package in CLASSPATH?
- Previous by thread: Re: how to return Comparator values
- Next by thread: Re: how to return Comparator values
- Index(es):
Relevant Pages
|
|