为没有equals()的对象创建一个hashmap或set

时间:2013-04-16 08:41:22

标签: java equals

我正在创建一个类的子类,其中equals()hashCode()final且基于标识。 (特别是XML DOM XOM与合同:

public final boolean equals(Object o)

    Tests for Node/Element identity. That is, two Node/Element objects 
    are equal if and only if they are the same object. 

Element是可子类化的(例如

 FooElement extends xom.nu.Element

我广泛使用它。我也开发了平等方法(例如

fooElementA.isEqualTo(fooElementB)

我想在创建集合和哈希映射时使用它。

我无法重写XOM库,也无法说服作者发布equals()方法。是否有可以使用的通用解决方法(例如包装器,委托,子类化HashMap等)?

注意:hashCode()也是最终版。

2 个答案:

答案 0 :(得分:4)

如果这是.NET,我建议你Dictionary with a custom IEqualityComparer<T>。在Java中,您需要将对象包装为实现hashCodeequals的{​​{3}}。

final class FooElementWrapper {

  private final FooElement inner;
  public FooElementWrapper(FooElement inner) {
    this.inner = inner;
  }

  @Override
  public int hashCode() {
    return 0; // replace by a proper implementation!!!
  }

  @Override
  public boolean equals(Object o) {
    if(o instanceof FooElementWrapper) {
      return this.isEqualTo((FooElementWrapper)o);
    } else {
      return false;
    }
  }

}

Set<FooElementWrapper>现在应该完成这项工作。您绝对应该使用适用于hashCode的公共变量的实现来重新实现FooElement

答案 1 :(得分:2)

您可以使用自己的比较器创建TreeSet(或TreeMap)。

Set<Element> set = new TreeSet<Element>(new Comparator<Element>() {
    @Override
    public int compare(Element e1, Element e2) {
        // Your own compare logic
    }
});

来自文档

  

请注意,如果要正确实现Set接口,则由set维护的排序(无论是否提供显式比较器)必须与equals一致。

这意味着您没有履行equals方法的一般合同。

您可以使用此方法当且仅当您在文档中明确说明您正在做什么。