Java 设置 - 更新后删除元素
Java Set - remove element after updating
我有以下代码:
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"}]
在这里,我添加了 class A
的 2 个不同元素(这个 class 实现了 equals 和 hashcode 方法)。然后我将 a2
对象上的 y
属性 更改为“1”。这实际上使 Set 在相等方面有 2 个重复元素,但 set 不知道这一点,因为修改是在添加元素后完成的。
删除重复项最简单的方法就是从现有的集合中创建新的集合(如 aSet = new HashSet<>(aSet)
行所做的那样),但我不确定是否有一些集合实现可以更有效地实现它?我可以做的一些实现 aSet.removeDuplicatesInPlace()
?
以更改对象 hashCode()
的方式更改存储在 HashSet 中的对象(或者是 HashMap 中的键)是错误的。这样做将导致 contains(object)
为对象的旧值和新值返回 false
。有关详细信息,请参阅 Are mutable hashmap keys a dangerous practice?。
我认为最好(也是最有效)的方法来完成您想要做的事情:
aSet.remove(a2);
a2.y = "1";
aSet.add(a2); // will not modify the set if an identical object is already present
我有以下代码:
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"}]
在这里,我添加了 class A
的 2 个不同元素(这个 class 实现了 equals 和 hashcode 方法)。然后我将 a2
对象上的 y
属性 更改为“1”。这实际上使 Set 在相等方面有 2 个重复元素,但 set 不知道这一点,因为修改是在添加元素后完成的。
删除重复项最简单的方法就是从现有的集合中创建新的集合(如 aSet = new HashSet<>(aSet)
行所做的那样),但我不确定是否有一些集合实现可以更有效地实现它?我可以做的一些实现 aSet.removeDuplicatesInPlace()
?
以更改对象 hashCode()
的方式更改存储在 HashSet 中的对象(或者是 HashMap 中的键)是错误的。这样做将导致 contains(object)
为对象的旧值和新值返回 false
。有关详细信息,请参阅 Are mutable hashmap keys a dangerous practice?。
我认为最好(也是最有效)的方法来完成您想要做的事情:
aSet.remove(a2);
a2.y = "1";
aSet.add(a2); // will not modify the set if an identical object is already present