26

I can use it to sort by emp id but I'm not sure if it is possible to compare strings. I get an error the operator is undefined for strings.

public int compareTo(Emp i) {
            if (this.getName() == ((Emp ) i).getName())
                return 0;
            else if ((this.getName()) > ((Emp ) i).getName())
                return 1;
            else
                return -1;
Jack
  • 351
  • 2
  • 6
  • 10
  • 9
    Curious, why do you need to cast `i` to `Emp` when you've already declared it to be `Emp` in the method signature? – BoltClock Sep 20 '10 at 05:02

5 Answers5

51

What you need to use is the compareTo() method of Strings.

return this.getName().compareTo(i.getName());

That should do what you want.

Usually when implementing the Comparable interface, you will just combine the results of using other Comparable members of the class.

Below is a pretty typical implementation of a compareTo() method:

class Car implements Comparable<Car> {
    int year;
    String make, model;
    public int compareTo(Car other) {
        if (!this.make.equalsIgnoreCase(other.make))
            return this.make.compareTo(other.make);
        if (!this.model.equalsIgnoreCase(other.model))
            return this.model.compareTo(other.model);
        return this.year - other.year;
    }
}
jjnguy
  • 136,852
  • 53
  • 295
  • 323
  • when i replace "else if ((this.getName()) > ((Emp ) i).getName())" with "else if (this.getName().compareTo(((Emp ) i).getName() > 0)", I get a similar error saying operator > is undefine for type String,int – Jack Sep 20 '10 at 05:09
  • 1
    @Jack: That's because your `> 0` is inside of the call to `compareTo()`; it needs to be outside that last parenthesis to compare the return value of the string comparison against zero (and then you need another parenthesis to complete the `else if` condition). – Tim Stone Sep 20 '10 at 05:15
  • @Jack, you should probably use the version of the method that everyone else is suggesting. Just directly return the value of `string.compareTo(string)`. – jjnguy Sep 20 '10 at 05:24
10

Pretty sure your code can just be written like this:

public int compareTo(Emp other)
{
    return this.getName().compareTo(other.getName());
}
Sam Day
  • 1,713
  • 9
  • 17
  • Oh I see. I must have been confused switching from comparing ints and string and used > sign. Thanks!! – Jack Sep 20 '10 at 05:12
6

Java String already implements Comparable. So you could simply write your method as

public int compareTo(Emp emp) {
   return this.getName().compareTo(emp.getName());
}

(ofcourse make sure you add proper validations such as null checks etc)

Also in your code, do not try to compare Strings using '=='. Use 'equals' method instead. '==' only compare string references while equals semantically compares two strings.

Gopi
  • 10,073
  • 4
  • 31
  • 45
3

You don't need to cast i to Emp, it's already an Emp:

public int compareTo(Emp i) {
    return getName().compareTo(i.getName());
}
Thomas Mueller
  • 48,905
  • 14
  • 116
  • 132
1

Shouldn't

if (this.getName() == ((Emp ) i).getName())

be

if (this.getName().equals(i.getName()))

zengr
  • 38,346
  • 37
  • 130
  • 192
  • 1
    As indicated by others, `getName().compareTo(i.getName());` is a better option anyway. – zengr Sep 20 '10 at 05:08