gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:42:01 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com