The Comparable interface allows you to sort by a specific object variable that you choose for your needs.
Take a look at the following object:
public class Book implements Comparable<Book> { private String title; private String author; private double price; public Book(String title, String author, double price) { super(); this.title = title; this.author = author; this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public int compareTo(Book that) { return Double.valueOf(this.price).compareTo(Double.valueOf(that.price)); } public String toString() { return " \n " + title + " \t " + author + " \t " + price; } }
Notice the way the compareTo method is overriden. It´s a double primitive variable, but you need the wrapper class to compare it. The following wouldn´t work:
@Override public int compareTo(Book that) { return this.price.compareTo(that.price); return 0; }
Implementing the Comparable interface affects the sorting criteria. For example:
import java.util.Arrays; public class ComparableTest{ public static void main(String[] args) { Book[] books= { new Book("The capital","Marx,Karl",10.5), new Book("Interpretation of dreams","Freud, S.",12.5), new Book("Killed by Death","Kilmister, Lemmy",8) }; System.out.println("Before sorting: \n"+Arrays.toString(books)); Arrays.sort(books); System.out.println("\n After sorting: \n"+Arrays.toString(books)); } }
The output is:
Before sorting:
[
The capital Marx,Karl 10.5,
Interpretation of dreams Freud, S. 12.5,
Killed by Death Kilmister, Lemmy 8.0]
After sorting:
[
Killed by Death Kilmister, Lemmy 8.0,
The capital Marx,Karl 10.5,
Interpretation of dreams Freud, S. 12.5]
If you need to do a more complex comparison, you can make your own comparator by extending the Comparator interface (not “Comparable”).
For example you can create your own Comparator:
public class BookComparator implements Comparator<Book> { @Override public int compare(Book b1, Book b2) { int comparePrice = Double.valueOf(b1.getPrice()).compareTo(Double.valueOf(b2.getPrice())); if (comparePrice!=0) {return comparePrice; } else return b1.getAuthor().compareTo(b2.getAuthor()); } }
It tries to order by price first, but ifthe books have the same price, they will be sorted by the author name too.
If you runt the following main method:
public static void main(String[] args) { ArrayList<Book> booksList = new ArrayList<Book>(); booksList.add(new Book("The capital", "Marx,Karl", 10.5)); booksList.add(new Book("Peace and War", "Tostoj. L.", 12.5)); booksList.add(new Book("Interpretation of dreams", "Freud, S.", 12.5)); booksList.add(new Book("Killed by Death", "Kilmister, Lemmy", 8)); System.out.println("before sorting:"); for (Book book : booksList) { System.out.println( book.toString()); } Collections.sort(booksList, new BookComparator()); System.out.println("" + "\n after sorting:"); for (Book book : booksList) { System.out.println(book.toString()); }
Then you see the following output:
before sorting:
The capital Marx,Karl 10.5
Peace and War Tostoj. L. 12.5
Interpretation of dreams Freud, S. 12.5
Killed by Death Kilmister, Lemmy 8.0
after sorting:
Killed by Death Kilmister, Lemmy 8.0
The capital Marx,Karl 10.5
Interpretation of dreams Freud, S. 12.5
Peace and War Tostoj. L. 12.5
Notice the order of the last two books.