比较和比较的负值和正值返回值
我知道这些方法的返回值的规则是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;
};
没有任何理由使用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这在逻辑上是错误的。
但是,如果您使用signum值order将是1,这意味着book1> book2。
但必须提到的是,您绝不应该对比较函数在1和-1之间返回值做任何假设。 您可以阅读比较器http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html的官方文档。
任何负数会做表明,<湾而任何正数都表明a> b。 -1和1可以达到目的。没有什么比“更少”或“更多”的意义;他们是二元属性。允许任何负面(或正面)价值的原因可能是历史的;对于整数,通过简单的减法来实现比较器是很常见的。
我能看到的唯一理由是,如果你想例如(a
和b
)比较两个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
是尝试(失败)来处理这个问题。
也许pedantry? – biziclop 2014-08-28 19:57:54
对不起,我在 – Goldi 2014-08-28 20:03:47
之后加了它可能价格有浮动或双重类型。如果是这样,那几乎是正确的实施。因为如果你只是写'(int)book1.getPrice() - book2.getPrice()',你可能会溢出。几乎是因为浮点类型的平等是可能的。 – talex 2014-08-28 20:07:36