gpt4 book ai didi

如果修改了包含的元素,则 Java HashSet 包含重复项

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:08:48 25 4
gpt4 key购买 nike

假设您有一个类,您创建了一个 HashSet 来存储此类的实例。如果您尝试添加相等的实例,集合中只会保留一个实例,这很好。

但是,如果您在 HashSet 中有两个不同的实例,并且您取一个并使其成为另一个的精确副本(通过复制字段),则 HashSet 将包含两个重复的实例。

下面是演示这一点的代码:

 public static void main(String[] args)
{
HashSet<GraphEdge> set = new HashSet<>();
GraphEdge edge1 = new GraphEdge(1, "a");
GraphEdge edge2 = new GraphEdge(2, "b");
GraphEdge edge3 = new GraphEdge(3, "c");

set.add(edge1);
set.add(edge2);
set.add(edge3);

edge2.setId(1);
edge2.setName("a");

for(GraphEdge edge: set)
{
System.out.println(edge.toString());
}

if(edge2.equals(edge1))
{
System.out.println("Equals");
}
else
{
System.out.println("Not Equals");
}
}

public class GraphEdge
{
private int id;
private String name;

//Constructor ...

//Getters & Setters...

public int hashCode()
{
int hash = 7;
hash = 47 * hash + this.id;
hash = 47 * hash + Objects.hashCode(this.name);
return hash;
}

public boolean equals(Object o)
{
if(o == this)
{
return true;
}

if(o instanceof GraphEdge)
{
GraphEdge anotherGraphEdge = (GraphEdge) o;
if(anotherGraphEdge.getId() == this.id && anotherGraphEdge.getName().equals(this.name))
{
return true;
}
}

return false;
}
}

以上代码的输出:

1 a
1 a
3 c
Equals

有没有办法强制 HashSet 验证其内容,以便删除在上述情况下创建的可能重复的条目?

一种可能的解决方案是创建一个新的 HashSet 并将内容从一个哈希集复制到另一个哈希集,这样新的哈希集就不会包含重复项,但我不喜欢这种解决方案。

最佳答案

您描述的情况无效。查看Javadoc :“如果对象的值以影响等于比较的方式更改,而对象是集合中的元素,则未指定集合的​​行为。”

关于如果修改了包含的元素,则 Java HashSet 包含重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114043/

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