2014-11-15 52 views
1

我知道这是问了很多,我不知道如果我很理解哈希码,但它应该是地址,让我怎么解决我的具体的例子?如果我的理解是正确的,我有双打在我的课,但我不能将它们添加到散列码,因为重载hashCode()方法在Java中使用双重价值

possible loss of precision 
found : double 
required: int 
    return this.area(); 

这里是我Shape类:

abstract class Shape implements Comparable<Shape> 
{ 
    abstract double area(); 


    public int compareTo(Shape sh){ 
     return Double.compare(this.area(),sh.area()); 
    } 

    public int hashCode() { 
     return this.area();  
    } 

    public boolean equals(Shape sh) { 
     if (sh instanceof Shape && this.area()==sh.area()) { 
      return true;   
     } else { 
      return false ; 
     } 
    } 
} 

area()的唯一的价值,我需要担心hashCode()?

+0

hashCode的行为应该与equals的行为相匹配,如果两个对象被认为相等,使用equals,那么两个对象的hashCode应该是相同的。如果您只使用形状的区域来确定它是否相等,那么您可以返回hashCode的区域。 – DanielGibbs

+3

'Shape'是一个抽象类。你是否希望同一区域的两个形状相同,即使它们是不同的形状? – khelwood

回答

3

您可以使用Double类的hashCode的例子:

public int hashCode() { 
    long bits = doubleToLongBits(value); 
    return (int)(bits^(bits >>> 32)); 
} 

这样可避免损失由简单的将double转换为int引起的精度。

如果该区域是确定hashCode的唯一属性,则可以使用完全相同的代码,用area代替value

但是,我不知道area是计算的hashCode一个很好的候选人,因为它本身就是从形状的子类的属性来计算。您应该根据该子类的特定属性在Shape的每个子类中实现hashCode。

+0

@ user4254704我假设该区域是使用Shape的子类的属性进行计算的。看我的编辑。 – Eran

+0

@ user4254704这是Double类的静态方法。试试Double。doubletolongbits – Eran

+0

如果我有多个值,该怎么办 –

1

不要只加数字加在一起,产生的哈希码;这很可能会为不相等的对象靠近在一起得到重复的散列码。相反,我建议使用标准Java API中的Objects.hash方法或Apache Commons-Lang中更具表现力和效率更高的HashCodeBuilder。您应该在hashCode计算中包含与您用于确定equals的字段完全相同的字段。

当然,作为@khelwood指出的那样,你很可能想要实现equalshashCode这个抽象的对象,因为1×4矩形和一个2x2的矩形可能是不相等的。相反,你可以在Shape重新申报这些方法作为abstract迫使子类实现他们:

public abstract class Shape { 
    @Override 
    public abstract int hashCode(); 
} 
+0

是的,我知道你在说什么,我只是不知道如何识别两个不同的形状是相等的 –

+0

@ user4254704你必须弄清楚什么是规则。大多数对象仅与完全相同类别的其他对象相同。 – chrylis

0

你可以这样做:

public int hashCode() { 
    return Double.valueOf(this.area()).hashCode(); 
} 

- 版:修正的valueOf方法名。谢谢@ user4254704。

+1

这给出了一个错误 –