2012-04-03 72 views
0

我在Java中产生了一堆对象。每个对象都有属性区和一组整数。我想要将这些对象存储在地图中(键值应该是越来越多的整数)。如果两个对象的面积相等并且它们的集合相同,则两个对象相同。在Java中找到相同的对象

如果两个对象没有相同的区域,那么我不需要检查它们的集合是否相同。

在Java中实现这一点的最佳实践是什么?我应该如何编写散列和相等的函数?

回答

1

下面是由IDE生成的样本对hashCode\equals

class Sample { 
    final int area; 
    final Set<Integer> someData; 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     Sample sample = (Sample) o; 

     if (area != sample.area) return false; 
     if (!someData.equals(sample.someData)) return false; 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     int result = area; 
     result = 31 * result + someData.hashCode(); 
     return result; 
    } 
} 

此代码假定someData不能为空 - 以简化事情。您可以看到首先检查类型的相等性,然后检查area相等性,然后检查相等性Set<Integer>。请注意,在此使用内置equalsSet - 因此您已重新使用该方法。这是测试复合类型是否平等的惯用方法。

1

你只需要你的对象来实现Comparableinterface并在compareTo方法中编写你的逻辑。这是一个很好的link来帮助你实现这一目标。

+3

只有在您要对对象进行排序时才需要。如果你只需要有这样的对象的字典,你只需要适当的'hashCode()'和'equals()' – 2012-04-03 12:56:44

1

只需要在equals(在==之后进行类型检查当然)首先比较它们的区域,如果它们不同,则返回false。如果面积相等,继续比较。

对于实施equals(和hashCode)一般来说,这里是a relevant threada good article(包括几个进一步的参考文献)。

1

一条经验法则是,你应该比较您的equals()执行所有相关领域(最快第一,所以在前面比较你area s,则整台),并在您的hashCode()使用相同的字段。如果有疑问,使用Eclipse的Source - Generate hashCode() and equals()...特征(。,然后修复equals()代码到第一比较area多个)

相关问题