public class Foo{
private final int A;
private final int B;
public boolean equals(Object o){
//type check omitted
return A==o.A && B==o.B;
}
}
我希望有另一个.equals()
方法,就像这样
public boolean equals(Object o){
return A==o.A;
}
首先使用A,B字段创建Foo对象,然后我想将它们发送到使用第二个equals()方法的Set<E>
仅比较字段A 。
我知道我可以创建只有A字段的新对象,但开销会很大。有什么建议吗?
答案 0 :(得分:6)
使用合成,您可以创建一个FooWrapper
类,该类提供equals
的自定义实现,并将其添加到集合中:
public class FooWrapper {
public final Foo foo; //constructor omitted
public boolean equals(Object other) {
//type check omitted here too
return foo.A == other.foo.A;
}
//hashCode omitted, but you need that too
}
不幸的是,使用Java Collections API无法告诉集合使用除上述方法之外的自定义equals
计算或子类化和覆盖equals()
。
让我感到震惊的是,您可以使用Map<Integer, Foo>
来代替,使用foo.A
作为关键字,使用foo
作为值(从而将其限制为唯一值A
)。如果没有更多的背景,我无法告诉你这是否合适。
答案 1 :(得分:0)
每Object
只能有一个equals实现,因为它覆盖了java.lang.Object
的继承方法。我认为你需要决定Foo
的平等意味着什么 - 是唯一重要的领域;如果是这样的话就是这样。您可以选择包装Foo
并为equals
对象提供自定义WrappedFoo
方法。然后,您可以将WrappedFoo
存储在Set
。
从设计的角度来看,这里听起来应该有两个对象 - 一个是A的值类,另一个是B的值类。如果需要一个Object来表示A和B,可以使用合成
答案 2 :(得分:0)
我为此编写了一个匹配框架:
基本接口是Matcher(类似于Comparable): http://softsmithy.sourceforge.net/lib/docs/api/org/softsmithy/lib/util/Matcher.html
MatchableObject是一个类,它将匹配策略应用于Object: http://softsmithy.sourceforge.net/lib/docs/api/org/softsmithy/lib/util/MatchableObject.html
Matchers是一个用于包装/解包MatchableObjects的实用程序类: http://softsmithy.sourceforge.net/lib/docs/api/org/softsmithy/lib/util/Matchers.html
该库是开源的。也许你发现它很有用。
主页:
下载:
http://sourceforge.net/projects/softsmithy/files/softsmithy/
的Maven:
<dependency>
<groupid>org.softsmithy.lib</groupid>
<artifactid>lib-core</artifactid>
<version>0.1</version>
</dependency>
答案 3 :(得分:0)
如果替代equals方法仅适用于此特定集合,我建议使用TreeSet(或其他SortedSet)而不是HashSet,以便您可以使用TreeSet(Comparator)
构造函数。