你有多个哈希码和等号吗?

时间:2012-08-09 20:56:56

标签: java

好吧,我需要指出正确的方向。我已经有一个哈希码和一个带有重载的equals方法。

@Override 
public int hashCode() {         
    return  type.hashCode() ^ type2.hashCode() ^ type3.hashCode()  ;        } 

@Override 
public boolean equals(Object obj) { 
    if (!(obj instanceof MyObject)) {
        return false;
    }
    MyObject mdc = (MyObject) obj; 
    return mdc.type.equals(type) && mdc.type2.equals(type2) && mdc.type3.equals(type3); 
}

现在如果我只想比较第一种和第二种而不是第三种呢?我可以使用两个哈希和相同的方法供以后使用吗?

我想要做的是,如果类型1和类型2匹配,则从当前的arraylist中删除它们并将它们添加到新列表中,显示哪些类型相同。这与上面显示的哈希码不同。

在数组中是否有另一种方式,我可以看到type1和type2的哪种组合出现多次?

例如:

  • Shooting Halo
  • 射击CallofDuty
  • Racing Forza
  • ............
  • .........
  • ..........
  • Shooting Halo

Shooting Halo出现两次,需要删除并添加到另一个列表中,但问题是我已经有一个哈希码供以前使用。

编辑:我要感谢大家的想法。我已经通过创建另一个具有类似getter和setter但具有更新的哈希代码的对象类来解决这个问题。下次我将使用更好的逻辑方法。我在这篇文章中的主要目标是知道是否有任何方法可以在一个类中使用多个哈希码和方法,这显然是不可能的。 :)

5 个答案:

答案 0 :(得分:7)

在同一个类中不能有两个具有相同签名的方法,因此不可能(这是java类/方法的通用原则,而不仅仅是equalshashcode方法。)< / p>

Dennis Meng所述,如果您遇到这种情况,则需要重新考虑您的设计。

答案 1 :(得分:2)

  

现在如果我只想比较第一种和第二种类型而不是   第三?

听起来我的要求驱动创建可以正确比较对象的不同类。所以一个类知道它应该只比较type1和type2而另一个类知道它应该比较所有3个(可能是对象的层次结构?)

答案 2 :(得分:1)

在一堂课中,没有办法。您可以对类进行子类化并覆盖hashCode()equals(..),并在一种情况下使用一个类的实例,在另一种情况下使用另一个类的实例。但是这整个场景看起来像是灾难的候选人,所以重新考虑你是否真的需要它。

如果您只想定义多个排序顺序,请使用外部Comparator实例。

答案 3 :(得分:0)

您不能拥有两种具有相似签名的方法。无论你提到什么逻辑,你都可以使用现有的equals方法并相应地返回结果

答案 4 :(得分:0)

听起来像你真正的问题不是平等,哈希码的事情......它试图处理一些集合已经有一个你试图把第二个进入并试图检测的事情的情况这是一个等于,哈希码的东西,它不仅仅知道被比较的两个对象。我想我正在“重新思考你的逻辑”列车,我相信你想要建立的集合比我认为你正在努力的Map<String,List<MyObject>>更多Set<MyObject>。 / p>

如果您尝试将MyObject实例推送到的数据结构为Map<String,List<MyObject>>,则MyObject equals / hashCode问题完全消失,因为有关equals()和hashcode()的字符串的默认处理将起作用。< / p>

在你的例子中,这最终会像......

[ "Shooting Halo", [ MyObject("Shooting Halo"), MyObject("Shooting Halo") ],
[ "Shooting CallofDuty", [ MyObject("Shooting CallofDuty") ],
[ "Racing Forza", [ MyObject("Racing Forza") ]

构建集合后,您可以解析它并找出如何处理具有多个值的Keys。如果您走这条路,请查看Google Guava库中的Multimap,因为它使这个用例变得微不足道。 http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained