Collections.sort() using comparator?
Solution 1
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!!!!!
Solution 2
Collections.sort which takes comparator sorts the List based on the Comparator provided by you and other follows natural sorting order.That is if you want to follow any custom sorting order then use this method. And nothing much to explain in that.
Use this link for explaination.
hakuna12
Updated on December 17, 2020Comments
-
hakuna12 over 3 years
import java.util.*; public class C_2 { public static void main(String args[]) { String theStrings[] = { "x", "a", "b", "c", "d" }; List l = Arrays.asList(theStrings); Collections.sort(l); // line a Collections.sort(l, new ThisIsMyThing()); // line b System.out.println(l); } } class ThisIsMyThing implements Comparator { public int compare(Object o1, Object o2) { String s1 = (String)o1; String s2 = (String)o2; return -1 * s1.compareTo(s2); } }
I understand that class
C_2
does sorting based on two different techniques. One is the standardCollections.sort(l);
And the other isCollections.sort(l,Comparator<>());
I am not able to understand this sort method. Can someone please explain it to me? -
hakuna12 over 10 yearsThanks for the explanation. Collections.sort() is possible only on a list ?
-
Louis Wasserman over 10 years@peeskillet: ...what?
Collections.sort
only accepts aList
argument. -
Louis Wasserman over 10 years@peeskillet: But even your revised version isn't true.
Collections.sort
is a static method on theCollections
class that only accepts aList
argument. Any class can invokeCollections.sort
, whether it implementsCollection
or not, but no matter who's invoking it, only aList
argument can be passed to it.