2

好吧,我需要指出正确的方向。我已经有一个哈希码和一个带有 override 的 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); 
}

现在如果我只想比较第一种和第二种类型而不是第三种呢?我可以有两个 hash 和 equal 方法供以后使用吗?

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

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

前任:

  • 射击光环
  • 射击使命召唤
  • 竞速极限
  • …………
  • …………
  • …………
  • 射击光环

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

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

4

5 回答 5

7

你不能在同一个类中有两个具有相同签名的方法,所以这是不可能的(这是java类/方法的共同原则,不仅仅是equalshashcode方法)。

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

于 2012-08-09T20:59:26.233 回答
2

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

在我看来,您的需求推动创建可以正确比较对象的不同类。所以一个类知道它应该只比较 type1 和 type2 而另一个知道它应该比较所有 3 个(也许是对象的层次结构?)

于 2012-08-09T21:06:54.477 回答
1

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

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

于 2012-08-09T21:00:58.103 回答
0

在我看来,您真正的问题不是等于哈希码的事情……它试图处理某些 Collection 已经具有您尝试放入第二个的事物之一并尝试用equals,hashcode 不仅知道被比较的两个对象。我想我在这里正在“重新思考你的逻辑”火车上,我相信你试图建立的收藏Map<String,List<MyObject>>Set<MyObject>我认为你目前正在努力解决的问题更多。

如果您尝试将 MyObject 实例推入的数据结构是Map<String,List<MyObject>>,则 MyObject equals/hashCode 问题将完全消失,因为有关 equals() 和 hashcode() 的 String 的默认处理将正常工作。

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

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

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

于 2012-08-09T21:24:50.763 回答
0

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

于 2012-08-09T21:00:30.943 回答