How to make two objects in Java comparable using "<" or ">" e.g.
MyObject<String> obj1= new MyObject<String>(“blablabla”, 25);
MyObject<String> obj2= new MyObject<String>(“nannaanana”, 17);
if (obj1 > obj2)
do something.
I've made MyObject class header as
public class MyObject<T extends Comparable<T>> implements Comparable<MyObject<T>>
and created method Comp but all the gain I got is now I can use "sort" on the list of objects, but how can I compare two objects to each other directly? Is
if(obj1.compareTo(obj2) > 0)
do something
the only way?
You cannot do operator overloading in Java. This means you are not able to define custom behaviors for operators such as
+
,>
,<
,==
, etc. in your own classes.As you already noted, implementing
Comparable
and using thecompareTo()
method is probably the way to go in this case.Another option is to create a
Comparator
(see the docs), specially if it doesn't make sense for the class to implementComparable
or if you need to compare objects from the same class in different ways.To improve the code readability you could use
compareTo()
together with custom methods that may look more natural. For example:Then you could use them like this:
It is not the only way. You can implement a Comparator as well. Comparator uses
compare()
method as oppose toComparable
which usescompareTo()
method.The reason you can't use
>
or<
to compare objects directly is because Java won't know which variable you want to use for the comparison (as there might exist more than one variable in the object).In order to compare objects, those objects must be comparable. You need to define and tell Java how you want to compare them.
Java collection provides a
sort
method. However some school does give assignment of asking you to write you own sort methods which ultimately still uses thecompareTo()
for comparison.You can take a look on the subtle differences between
Comparable
vsComparator
here: What is the difference between compare() and compareTo()?I think it is also worth mentioning that, by default Java compares String (objects) in a lexicographical order if you did not override the
compareTo()
method.Using
Comparable.compareTo(T)
is the only option (orComparator
). The interface only defines that one method (whileComparator
addsequals
), and it compares this object with the specified object for order. Further, Java does not permit operator overloading (so you won't be able to directly change the operand used for invoking that method; or in fact modify the interface).