比较和比较的负值和正值返回值

问题描述:

我知道这些方法的返回值的规则是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; 
}; 
+0

也许pedantry? – biziclop 2014-08-28 19:57:54

+0

对不起,我在 – Goldi 2014-08-28 20:03:47

+2

之后加了它可能价格有浮动或双重类型。如果是这样,那几乎是正确的实施。因为如果你只是写'(int)book1.getPrice() - book2.getPrice()',你可能会溢出。几乎是因为浮点类型的平等是可能的。 – talex 2014-08-28 20:07:36

没有任何理由使用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 

如果不使用正负号你将永远不会有任何编译或运行时错误,但订单的值将为0.这意味着book1等于book2,其中i这在逻辑上是错误的。

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

但必须提到的是,您绝不应该对比较函数在1和-1之间返回值做任何假设。 您可以阅读比较器http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html的官方文档。

任何负数会做表明,<湾而任何正数都表明a> b。 -1和1可以达到目的。没有什么比“更少”或“更多”的意义;他们是二元属性。允许任何负面(或正面)价值的原因可能是历史的;对于整数,通过简单的减法来实现比较器是很常见的。

我能看到的唯一理由是,如果你想例如(ab)比较两个int s,而你写

return a - b; 

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

PS:实施频繁的错误就是用减法

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

    return this.intField - other.intField; 
} 

,因为如果你打电话new OurClass(Integer.MIN_VALUE).compareTo(new OurClass(Integer.MAX_VALUE))你得到溢出这是错误的。可能Math.abs是尝试(失败)来处理这个问题。