Java compare和compareTo的正负返回值

Java compare和compareTo的正负返回值,java,return-value,comparable,compareto,Java,Return Value,Comparable,Compareto,我读到这些方法返回值的规则是,对于obj1.compareTo(obj2),例如,如果obj2在层次结构中的obj1之下,则返回值为负,如果返回值在obj1之上,则返回值为正(如果相等,则返回值为0)。然而,在我的课堂上,我看到了使用Math.signum在compareTo方法中得到-1(表示负数)和1(表示正数)的例子 有什么原因吗 编辑: 以下是我的意思: Comparator comp = new Comparator() { public int compare(Object

我读到这些方法返回值的规则是,对于obj1.compareTo(obj2),例如,如果obj2在层次结构中的obj1之下,则返回值为,如果返回值在obj1之上,则返回值为(如果相等,则返回值为0)。然而,在我的课堂上,我看到了使用Math.signum在compareTo方法中得到-1(表示负数)和1(表示正数)的例子

有什么原因吗


编辑:

以下是我的意思:

Comparator comp = new Comparator() {
   public int compare(Object obj1, Object obj2) {
       Book book1 = (Book) obj1;
       Book book2 = (Book) obj2;

       int order = book1.getAuthor().compareTo(book2.getAuthor());
       if (order  == 0) {
          order = (int) Math.signum(book1.getPrice() - book2.getPrice());
       }
   return order;
};

任何负数都可以表示ab-1和1很好地达到了这个目的。没有“比”或“比”更大的感觉;它们是二进制属性。允许任何负值(或正值)的原因可能是历史原因;对于整数,通常通过简单的减法实现比较器。

任何负数都可以表示ab-1和1很好地达到了这个目的。没有“比”或“比”更大的感觉;它们是二进制属性。允许任何负值(或正值)的原因可能是历史原因;对于整数,通常通过简单的减法来实现比较器。

我能看到的唯一原因是,如果你想比较两个
int
s,例如(
a
b
),你可以写

return a - b;

它可能溢出。如果您将它们转换为双精度,并使用
(int)Math.signum((double)a-(double)b)
,您肯定会避免这种情况。但是有更简单的方法来达到同样的效果,
Integer。例如,比较(a,b)

我能看到的唯一原因是,如果你想比较两个
int
,例如(
a
b
),你可以写

return a - b;
它可能溢出。如果您将它们转换为双精度,并使用
(int)Math.signum((double)a-(double)b)
,您肯定会避免这种情况。但是有更简单的方法可以达到同样的效果,
Integer。例如,比较(a,b)

PS:执行中经常出现的错误是使用减法

public int compareTo(Object o) {
     OurClass other = (OurClass)o; //Skip type check

     return this.intField - other.intField;
}
这是错误的,因为如果调用
newourclass(Integer.MIN\u值).compareTo(newourclass(Integer.MAX\u值))
就会溢出。可能是
Math.abs试图(失败)处理这个问题。

PS:执行中经常出现的错误是使用减法

public int compareTo(Object o) {
     OurClass other = (OurClass)o; //Skip type check

     return this.intField - other.intField;
}

这是错误的,因为如果调用
newourclass(Integer.MIN\u值).compareTo(newourclass(Integer.MAX\u值))
就会溢出。可能
Math.abs
试图(失败)处理此问题。

是否有任何理由使用Math.signum

是的

order = (int) Math.signum(book1.getPrice() - book2.getPrice());
假设您已将上面的行替换为

order = (int)(book1.getPrice() - book2.getPrice());
现在让我们假设

book1.getPrice() returns 10.50 
book2.getPrice() returns  10.40
如果不使用signum,则永远不会有任何编译时或运行时错误,但order的值将为0。这意味着book1等于book2,这在逻辑上是错误的

但是如果使用signumorder的值将是1,这意味着book1>book2

但必须提到的是,您永远不应该对比较函数返回值1和-1做任何假设。
您可以阅读比较器的官方文件

是否有任何理由使用Math.signum

是的

order = (int) Math.signum(book1.getPrice() - book2.getPrice());
假设您已将上面的行替换为

order = (int)(book1.getPrice() - book2.getPrice());
现在让我们假设

book1.getPrice() returns 10.50 
book2.getPrice() returns  10.40
如果不使用signum,则永远不会有任何编译时或运行时错误,但order的值将为0。这意味着book1等于book2,这在逻辑上是错误的

但是如果使用signumorder的值将是1,这意味着book1>book2

但必须提到的是,您永远不应该对比较函数返回值1和-1做任何假设。
您可以阅读比较器的官方文件

很抱歉,我添加了它后,可能价格有浮动或双类型。如果是这样的话,它几乎就是正确的实现。因为如果您只编写
(int)book1.getPrice()-book2.getPrice()
,可能会出现溢出。几乎是因为浮点类型相等时可能出现truble。@talex,如果您编写
(int)(book1.getPrice()-book2.getPrice())
,微小的差异将被错误地四舍五入为零。@biziclop yes。我并没有看到明显的问题:(很抱歉,我在price有float或double类型之后添加了它。如果是这样,它几乎是正确的实现。因为如果您只编写
(int)book1.getPrice()-book2.getPrice()
您可能会出现溢出。这几乎是因为浮点类型相等时可能出现truble。@talex,如果您编写
(int)(book1.getPrice()-book2.getPrice())
,微小的差异将被错误地舍入为零。@biziclop是的。我没有看到明显的问题:(