Collection.sort(l)
assumes that the contents of l
are Comparable
. Collection.sort(1, Comparator)
uses a custom comparator to compare the contents of l
, this is what you did. The very idea of sorting (including the sort()
method) implies the objects MUST be comparable - in this case, with either Comparable
or Comparator
.
Note that many Java objects are comparable already, including String
, Date
and Number
. For those, you can just use Collection.sort(someList);
Example
Say you have a Circle
class
public class Circle {
double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getArea(){
return radius * radius * Math.PI;
}
}
If you created 100 Circle
objects:
ArrayList<Circle> circleList = new ArrayList<>();
for (int i = 0; i < 100; i++) {
// adds a circle with random radius
circleList.add(new Circle((int)(Math.random() * 100)));
}
// try to sort the list
Collections.sort(circleList); //compilation error: must be Comparable
You can't sort them because Java has no idea how to compare them. You have to tell this to Java:
public class Circle implements Comparable<Circle> {
double radius;
public Circle(double radius) {
this.radius = radius;
}
// you MUST override the compareTo method from the Comparable interface
@Override
public int compareTo(Circle cirlce){
if (this.getArea() > circle.getArea())
return 1;
else if (this.getArea() == circle.getArea())
return 0;
else
return -1;
}
public double getArea(){
return radius * radius * Math.PI;
}
}
With the compareTo()
method in the Circle class, Java now knows how to compare them and can sort them.
Now you can do this:
Collections.sort(circleList);
// Yayyy I'm being sorted by the size of my areas!!!!!