ork*_*ork 2 java groovy set hashset guava
我正在寻找一个建议.我有一个PersonString firstName和String lastName的类当我想要插入具有相同String的列表值时:
set.add(new Person("firstName","lastName"))
set.add(new Person("firstName","lastName"))
Run Code Online (Sandbox Code Playgroud)
该集合不会过滤对象,他们仍然进入集合.有没有建议创建集合列表而不重写equales和hashcode函数?也许用番石榴或一些groovy列表?谢谢,或者.
Xae*_*ess 11
在番石榴中有一个等价类,专门用于此类事物.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());
}
}
Run Code Online (Sandbox Code Playgroud)
然后是这段代码
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);
Run Code Online (Sandbox Code Playgroud)
版画
[PersonEquivalence@8813f2.wrap(Person{firstName=Jane, lastName=Doe}),
PersonEquivalence@8813f2.wrap(Person{firstName=Joe, lastName=Doe})]
Run Code Online (Sandbox Code Playgroud)
当然它有点冗长,但您可以创建ForwardingSet来自动Person为您包装和解包.