将两个 objects 与 Java 中的“<”或“>”运算符进行比较

Compare two objects with "<" or ">" operators in Java

如何使用“<”或“>”使 Java 中的两个 objects 具有可比性 例如

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

我已经将 MyObject class header 设为

public class MyObject<T extends Comparable<T>> implements Comparable<MyObject<T>> 并创建了方法 Comp 但我得到的所有收获是现在我可以在 objects 的列表中使用 "sort",但是我如何直接比较两个 objects?是

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

唯一的方法?

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

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

另一种选择是创建一个 Comparator(参见 docs),特别是如果 class 无法实现 Comparable 或者如果您需要以不同的方式比较来自相同 class 的对象。

为了提高代码的可读性,您可以将 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
}

使用Comparable.compareTo(T) is the only option (or Comparator)。该接口只定义了一个方法(而Comparator添加了equals),它将此对象与指定对象进行比较以进行排序。进一步,Java 不允许运算符重载(因此您将无法直接更改用于调用该方法的操作数;或者实际上修改接口)。

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

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

为了比较对象,这些对象必须是可比较的。您需要定义并告诉 Java 您希望如何比较它们。

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

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


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

我主张可读性必须成为我们的入门书。

Apache Commons Lang (commons-lang) 提供了一个简单流畅的实用程序,读起来更清晰:

if (is(obj1).greaterThan(obj2)) {
     // do something
}

注意:对于 ComparableUtils.isis 是 shorthand,可以使用此导入语句启用:

import static org.apache.commons.lang3.compare.ComparableUtils.is;