将两个 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()
进行比较。
您可以在此处查看 Comparable
与 Comparator
之间的细微差别:What is the difference between compare() and compareTo()?
我认为还值得一提的是,如果您没有重写 compareTo()
方法,默认情况下 Java 会按字典顺序比较字符串(对象)。
我主张可读性必须成为我们的入门书。
Apache Commons Lang (commons-lang) 提供了一个简单流畅的实用程序,读起来更清晰:
if (is(obj1).greaterThan(obj2)) {
// do something
}
注意:对于 ComparableUtils.is
,is
是 shorthand,可以使用此导入语句启用:
import static org.apache.commons.lang3.compare.ComparableUtils.is;
如何使用“<”或“>”使 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()
进行比较。
您可以在此处查看 Comparable
与 Comparator
之间的细微差别:What is the difference between compare() and compareTo()?
我认为还值得一提的是,如果您没有重写 compareTo()
方法,默认情况下 Java 会按字典顺序比较字符串(对象)。
我主张可读性必须成为我们的入门书。
Apache Commons Lang (commons-lang) 提供了一个简单流畅的实用程序,读起来更清晰:
if (is(obj1).greaterThan(obj2)) {
// do something
}
注意:对于 ComparableUtils.is
,is
是 shorthand,可以使用此导入语句启用:
import static org.apache.commons.lang3.compare.ComparableUtils.is;