如何在不改变equals和hashcode的情况下插入到set中

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为您包装和解包.