How to use the Comparable CompareTo on Strings in Java
Solution 1
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;
}
}
Solution 2
Pretty sure your code can just be written like this:
public int compareTo(Emp other)
{
return this.getName().compareTo(other.getName());
}
Solution 3
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.
Solution 4
You don't need to cast i to Emp, it's already an Emp:
public int compareTo(Emp i) {
return getName().compareTo(i.getName());
}
Solution 5
Shouldn't
if (this.getName() == ((Emp ) i).getName())
be
if (this.getName().equals(i.getName()))
Related videos on Youtube
Jack
Updated on November 20, 2020Comments
-
Jack over 3 years
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;
-
BoltClock over 13 yearsCurious, why do you need to cast
i
toEmp
when you've already declared it to beEmp
in the method signature?
-
-
zengr over 13 yearsAs indicated by others,
getName().compareTo(i.getName());
is a better option anyway. -
Jack over 13 yearswhen 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 over 13 yearsOh I see. I must have been confused switching from comparing ints and string and used > sign. Thanks!!
-
Tim Stone over 13 years@Jack: That's because your
> 0
is inside of the call tocompareTo()
; 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 theelse if
condition). -
jjnguy over 13 years@Jack, you should probably use the version of the method that everyone else is suggesting. Just directly return the value of
string.compareTo(string)
.