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
.



Relevant Pages

  • sorting an ArrayList by x or y value
    ... program I have to write that needs to use a Comparator. ... public int compare ... double pee = p.getX; ... double kyew = q.getX; ...
    (comp.lang.java.help)
  • Re: sorting an ArrayList by x or y value
    ... program I have to write that needs to use a Comparator. ... public int compare{ ... double pee = p.getX; ... double kyew = q.getX; ...
    (comp.lang.java.help)
  • Re: Can you help me understand this?
    ... I know the intention is to provide your own comparator so that your list can be sorted by using it. ... public String firstName, lastName; ... public int compare{ ... int lastNameCompareResult = o1.lastName.compareTo; ...
    (comp.lang.java.programmer)
  • Re: Instance Variable vs Local Variable
    ... > When delegating a compareTo method for a playing card to a Comparator, ... > public int compareTo ... Comparator implementations belong to a general class of ...
    (comp.lang.java.programmer)
  • Re: which data structure
    ... "mank" wrote in message ... > Now given an age, I have to search for dollars. ... public int getDollars{ ... I hope I didn't just do somebody's homework. ...
    (comp.lang.java.programmer)