将两个对象与"<"进行比较或">" Java中的运算符

时间:2015-03-21 04:18:20

标签: java object operator-overloading comparable

如何在Java中使用"<"或">" 例如

MyObject<String> obj1= new MyObject<String>(“blablabla”, 25);
MyObject<String> obj2= new MyObject<String>(“nannaanana”, 17);
if (obj1 > obj2) 
    do something. 

我已将MyObject类标题设为

public class MyObject<T extends Comparable<T>> implements Comparable<MyObject<T>> 并创建了方法Comp但我获得的所有收益现在我可以使用&#34; sort&#34;在对象列表上,但如何直接比较两个对象?是

if(obj1.compareTo(obj2) > 0)
     do something

唯一的方法?

3 个答案:

答案 0 :(得分:15)

您无法在Java中执行运算符重载。这意味着您无法在自己的类中为+><==等运算符定义自定义行为。

正如您已经指出的那样,在这种情况下,实施Comparable并使用compareTo()方法可能就是这样。

另一种选择是创建Comparator(请参阅docs),特别是如果对于实施Comparable的课程没有意义,或者您需要进行比较来自同一类的对象以不同的方式。

为了提高代码可读性,您可以将compareTo()与可能看起来更自然的自定义方法结合使用。例如:

boolean isGreaterThan(MyObject<T> that) {
    return this.compareTo(that) > 0;
}

boolean isLessThan(MyObject<T> that) {
    return this.compareTo(that) < 0;
}

然后你可以像这样使用它们:

if (obj1.isGreaterThan(obj2)) {
    // do something
}

答案 1 :(得分:3)

使用Comparable.compareTo(T)是唯一的选择(或Comparator)。接口仅定义一个方法(Comparator添加equals),并且将此对象与指定的对象进行比较以进行排序。此外,Java不允许运算符重载(所以你不能直接改变用于调用该方法的操作数;或者实际上修改了接口。)

答案 2 :(得分:1)

这不是唯一的方法。您也可以实现Comparator。比较者使用compare()方法反对使用Comparable方法的compareTo()

您无法使用><直接比较对象的原因是因为Java不知道您要将哪个变量用于比较(因为可能存在)对象中有多个变量。)

为了比较对象,这些对象必须具有可比性。您需要定义并告诉Java如何比较它们。

Java集合提供了sort方法。然而,有些学校确实要求您编写自己的排序方法,最终仍然使用compareTo()进行比较。

您可以在此处查看ComparableComparator之间的微妙差异:What is the difference between compare() and compareTo()?


我认为值得一提的是,默认情况下,如果您没有覆盖compareTo()方法,Java会按字典顺序比较字符串(对象)。