Java集-更新后删除元素

Java集-更新后删除元素,java,duplicates,set,hashset,Java,Duplicates,Set,Hashset,我有以下代码: Set<A> aSet = new HashSet<>(); A a1 = new A(); //{1,"1"} a1.x = 1; a1.y = "1"; A a2 = new A(); //{1,"2"} a2.x = 1; a2.y = "2"; aSet.add(a1); aSet.add(a2); a2.y = "1"; // {1,"

我有以下代码:

Set<A> aSet = new HashSet<>();
A a1 = new A(); //{1,"1"}
a1.x = 1;
a1.y = "1";
A a2 = new A(); //{1,"2"}
a2.x = 1;
a2.y = "2";

aSet.add(a1);
aSet.add(a2);

a2.y = "1"; // {1,"2"} ---> {1,"1"}

System.out.println(aSet);   //[A{x=1, y="1"}, A{x=1, y="1"}]

//aSet.removeDuplicatesInPlace(); //TODO: is there something like this?

aSet = new HashSet<>(aSet);
System.out.println(aSet);   //[A{x=1, y="1"}]
setaset=newhashset();
a1=新的A()//{1,"1"}
a1.x=1;
a1.y=“1”;
a2=新的A()//{1,"2"}
a2.x=1;
a2.y=“2”;
附加条款(a1);
附加条款(a2);
a2.y=“1”//{1,"2"} ---> {1,"1"}
系统输出打印LN(aSet)//[A{x=1,y=“1”},A{x=1,y=“1”}]
//aSet.RemovedUpplicatesInplace()//托多:有这样的吗?
aSet=新哈希集(aSet);
系统输出打印LN(aSet)//[A{x=1,y=“1”}]
在这里,我添加了类
A
的两个不同元素(这个类实现了equals和hashcode方法)。然后我将
a2
对象上的
y
属性更改为“1”。这实际上使集合有两个相等的重复元素,但集合无法知道,因为修改是在添加元素之后进行的


删除重复项最简单的方法是从现有的集合中创建新的集合(正如第
aSet=newhashset(aSet)
行中所做的那样),但我不确定是否有更有效的集合实现?一些实现,其中我可以只执行
aSet.removeDuplicatesInPlace()

以更改对象的
hashCode()
的方式更改存储在HashSet(或HashMap中的键)中的对象是错误的。这样做将导致
contains(object)
为对象的新旧值返回
false
。请参阅以了解更多关于此的信息

我认为最好(也是最有效)的方法是:

aSet.remove(a2);
a2.y = "1";
aSet.add(a2); // will not modify the set if an identical object is already present

我认为这个例子为使集合中的对象不可变()提供了一个很好的例子。我有一个递归算法,所以我真的需要一个对该对象的引用,该引用需要在以后修改。我想这也可以通过不可变对象实现,但需要更多的辅助数据结构。