在 Java 中使用“<”或“>”运算符比较两个对象

Posted

技术标签:

【中文标题】在 Java 中使用“<”或“>”运算符比较两个对象【英文标题】:Compare two objects with "<" or ">" operators in Java 【发布时间】:2015-03-21 04:18:20 【问题描述】:

如何使用“”使 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&lt;T extends Comparable&lt;T&gt;&gt; implements Comparable&lt;MyObject&lt;T&gt;&gt; 并创建了方法 Comp 但我得到的所有收获是现在我可以在对象列表上使用“排序”,但是如何直接将两个对象相互比较?是

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

唯一的办法?

【问题讨论】:

“[compareTo] 是唯一的方法吗?”是的。 您不能在 Java 中重载 &lt;&gt; 运算符。 在 C# 中,您可以像这样重载运算符。 您无法与&gt; & &lt; 进行比较,因为您的对象中可能存在多个变量,Java 不知道您要使用哪个变量进行比较。如果不重写 compareTo 方法,它将按词法顺序比较字符串对象。 嗯,compareTo 不是 only 方式——如果需要,您可以定义 isLessThanisGreaterThan 等方法,返回 @987654332 @。可以说它们比compareTo 更具可读性。 【参考方案1】:

您不能在 Java 中进行运算符重载。这意味着您无法在自己的类中为 +&gt;&lt;== 等运算符定义自定义行为。

正如您已经指出的,在这种情况下,实现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

【讨论】:

【参考方案2】:

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

【讨论】:

还有Comparator @Makoto Comparator 提供了两种方法(并且仍然不允许运算符重载),但这是公平的,因为它在技术上是另一种选择。 我只是从“其他选项”的角度来看它。 :)【参考方案3】:

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

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

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

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

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


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

【讨论】:

【参考方案4】:

我主张可读性必须是我们的入门。

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

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

注意:isComparableUtils.is 的简写,可以使用以下导入语句启用:

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

【讨论】:

以上是关于在 Java 中使用“<”或“>”运算符比较两个对象的主要内容,如果未能解决你的问题,请参考以下文章

Java运算符优先级

Java位运算在程序设计中的使用:位掩码(BitMask)

Java位运算在程序设计中的使用:位掩码(BitMask)

Java 位运算符

Java运算符的优先级与结合性是怎样的?

Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)