java - 如何在不更改 equals 和 hashcode 的情况下插入集合

标签 java groovy set guava hashset

我正在寻找建议。 我有一个包含 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/

相关文章:

java - org.apache.axis2.AxisFault :Transport error: 407 Error:Proxy Authentication Required

java - 如何使 Java Canvas 看起来从其容器中升起

grails - 枚举构造函数仅在枚举类内部允许ara

java - Junit 使用 groovy 预期异常

java - 如何迭代 Map.Entry 的 SortedSet

c++ - 如何创建一个使用局部变量对元素进行排序的集合?

java - 天空盒不显示纹理

java - 从 ArrayList 中删除对象

jenkins - Jenkins 共享库中的全局变量

c++ - 如何在出现特定字符后跳过字符串中的所有字符