我有以下代码:
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"}]
在这里,我添加了两个不同的类元素 A
(此类实现了equals和hashcode方法)。然后我改变 y
上的属性 a2
反对“1”。这实际上使set有两个相等的重复元素,但set不能知道,因为修改是在添加元素之后进行的。
删除重复项最简单的方法就是从现有的重复项中创建一个新的重复项(就像在第行中所做的那样) aSet = new HashSet<>(aSet)
),但我不确定是否有一套更有效的实现方案?一些我可以做的实现 aSet.removeDuplicatesInPlace()
?
1条答案
按热度按时间vd8tlhqk1#
更改存储在hashset(或hashmap中的键)中的对象的方式会更改
hashCode()
对象的名称。这样做会导致contains(object)
返回false
对象的新旧值。看看可变hashmap键是不是一种危险的做法?更多信息。我认为最好的(也是最有效的)方法是: