Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I write a compareTo method which compares objects?

I am learning about arrays, and basically I have an array that collects a last name, first name, and score.

I need to write a compareTo method that will compare the last name and then the first name so the list could be sorted alphabetically starting with the last names, and then if two people have the same last name then it will sort the first name.

I'm confused, because all of the information in my book is comparing numbers, not objects and Strings.

Here is what I have coded so far. I know it's wrong but it at least explains what I think I'm doing:

public int compare(Object obj) // creating a method to compare  {        Student s = (Student) obj; // creating a student object      // I guess here I'm telling it to compare the last names?     int studentCompare = this.lastName.compareTo(s.getLastName());       if (studentCompare != 0)         return studentCompare;     else      {         if (this.getLastName() < s.getLastName())             return - 1;          if (this.getLastName() > s.getLastName())             return 1;     }     return 0; } 

I know the < and > symbols are wrong, but like I said my book only shows you how to use the compareTo.

like image 744
Jeremy B Avatar asked Apr 04 '12 18:04

Jeremy B


People also ask

How does compareTo method compare objects in Java?

Java - compareTo() Method The method compares the Number object that invoked the method to the argument. It is possible to compare Byte, Long, Integer, etc. However, two different types cannot be compared, both the argument and the Number object invoking the method should be of the same type.

How do you compare two objects in a method?

The equals() method of the Object class compare the equality of two objects. The two objects will be equal if they share the same memory address. Syntax: public boolean equals(Object obj)

How do you use compareTo comparable?

The compareTo method required by the Comparable interface receives as its parameter the object to which the "this" object is compared. If the "this" object comes before the object received as a parameter in terms of sorting order, the method should return a negative number.


2 Answers

This is the right way to compare strings:

int studentCompare = this.lastName.compareTo(s.getLastName());  

This won't even compile:

if (this.getLastName() < s.getLastName()) 

Use if (this.getLastName().compareTo(s.getLastName()) < 0) instead.

So to compare fist/last name order you need:

int d = getFirstName().compareTo(s.getFirstName()); if (d == 0)     d = getLastName().compareTo(s.getLastName()); return d; 
like image 81
Eugene Retunsky Avatar answered Oct 01 '22 09:10

Eugene Retunsky


The compareTo method is described as follows:

Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.

Let's say we would like to compare Jedis by their age:

class Jedi implements Comparable<Jedi> {      private final String name;     private final int age;         //... } 

Then if our Jedi is older than the provided one, you must return a positive, if they are the same age, you return 0, and if our Jedi is younger you return a negative.

public int compareTo(Jedi jedi){     return this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0; } 

By implementing the compareTo method (coming from the Comparable interface) your are defining what is called a natural order. All sorting methods in JDK will use this ordering by default.

There are ocassions in which you may want to base your comparision in other objects, and not on a primitive type. For instance, copare Jedis based on their names. In this case, if the objects being compared already implement Comparable then you can do the comparison using its compareTo method.

public int compareTo(Jedi jedi){     return this.name.compareTo(jedi.getName()); } 

It would be simpler in this case.

Now, if you inted to use both name and age as the comparison criteria then you have to decide your oder of comparison, what has precedence. For instance, if two Jedis are named the same, then you can use their age to decide which goes first and which goes second.

public int compareTo(Jedi jedi){     int result = this.name.compareTo(jedi.getName());     if(result == 0){         result = this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0;     }     return result; } 

If you had an array of Jedis

Jedi[] jediAcademy = {new Jedi("Obiwan",80), new Jedi("Anakin", 30), ..} 

All you have to do is to ask to the class java.util.Arrays to use its sort method.

Arrays.sort(jediAcademy); 

This Arrays.sort method will use your compareTo method to sort the objects one by one.

like image 24
Edwin Dalorzo Avatar answered Oct 01 '22 09:10

Edwin Dalorzo