我正在寻找建议。
我有一个包含 String firstName 和 String lastName 的 Person
类
当我试图插入具有相同字符串的列表值时,例如:
set.add(new Person("firstName","lastName"))
set.add(new Person("firstName","lastName"))
集合不会过滤对象,它们仍然进入集合。 有什么建议可以创建集合列表而不覆盖 equales 和 hashcode 函数吗? 也许用 Guava 或一些绝妙的 list ? 谢谢, 或者。
最佳答案
在 Guava 中有一个Equivalence类专为此类事情而设计。创建您自己的Equivalence
类,如下所示:
import com.google.common.base.Equivalence;
import com.google.common.base.Objects;
public class PersonEquivalence extends Equivalence<Person> {
@Override
protected boolean doEquivalent(Person p1, Person p2) {
return Objects.equal(p1.getFistName(), p2.getFistName())
&& Objects.equal(p1.getLastName(), p2.getLastName());
}
@Override
protected int doHash(Person person) {
return Objects.hashCode(person.getFistName(), person.getLastName());
}
}
然后是这段代码
Set<Equivalence.Wrapper<Person>> set = Sets.newHashSet();
PersonEquivalence personEquivalence = new PersonEquivalence();
set.add(personEquivalence.wrap(new Person("Joe", "Doe")));
set.add(personEquivalence.wrap(new Person("Joe", "Doe")));
set.add(personEquivalence.wrap(new Person("Jane", "Doe")));
System.out.println(set);
打印
[PersonEquivalence@8813f2.wrap(Person{firstName=Jane, lastName=Doe}),
PersonEquivalence@8813f2.wrap(Person{firstName=Joe, lastName=Doe})]
当然这有点冗长,但是您可以创建 ForwardingSet自动为您包装和解开 Person
。
关于java - 如何在不更改 equals 和 hashcode 的情况下插入集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12508332/