如何解决设置在 Apex 中也显示重复数据
我创建了一个显示重复数据的集合。怎么可能?
Set<Account> s = new Set<Account>();
Account a1 = new Account(Name='Hello1',NumberofEmployees=20);
Account a2 = new Account(Name='Hello2',NumberofEmployees=20);
Account a3 = new Account(Name='Hello3',NumberofEmployees=20);
Account a4 = new Account(Name='Hello4');
Account a5 = new Account(Name='Hello1');
s.add(a1);
s.add(a2);
s.add(a3);
s.add(a4);
s.add(a5);
System.debug(s);
a4.NumberOfEmployees = 30;
a5.NumberOfEmployees = 20;
System.debug(s);
System.debug('----------Loop---------');
for (Account acc: s) {
System.debug(acc);
}
调试报告
DEBUG|{Account:{Name=Hello1},Account:{Name=Hello1,NumberOfEmployees=20},Account:{Name=Hello2,Account:{Name=Hello3,Account:{Name=Hello4}}
DEBUG|{Account:{Name=Hello1,Account:{Name=Hello4,NumberOfEmployees=30}}
DEBUG|-------Loop--------
DEBUG|Account:{Name=Hello1,NumberOfEmployees=20}
DEBUG|Account:{Name=Hello2,NumberOfEmployees=20}
DEBUG|Account:{Name=Hello3,NumberOfEmployees=20}
DEBUG|Account:{Name=Hello4,NumberOfEmployees=30}
DEBUG|Account:{Name=Hello1,NumberOfEmployees=20}
如何在像 hello1 这样的循环中显示重复值,因为 set 假设只存储唯一数据。
解决方法
这不是错误。为了知道一个元素是否重复(在调用 add、contains 等时),集合会检查它的 hashCode。
HashSet 将其元素存储到数组中,使用元素的 hashCode 作为索引。
当您将 a1
和 a5
添加到集合时,它们具有不同的 hashCode,因此不会发生冲突。
通过改变对象的任何属性,它的 hasCode 会改变,但集合中的位置不会。如果您这样做,set.contains
确实会返回 false。
Set<Account> s = new Set<Account>();
Account a1 = new Account(Name='Hello1',NumberofEmployees=20);
s.add(a1);
a1.Site = 'test';
// the hashCode's changed so the set doesn't find a1...
System.assertEquals(false,s.contains(a1));
// ...and it can be added again to the set in a different position.
s.add(a1);
System.assertEquals(2,s.size());
Account a2 = new Account(Name='Hello1',NumberofEmployees=20,Site='Test');
// a2 has the same hashCode of a1,so you "find" it...
System.assertEquals(true,s.contains(a2));
// ...and if you add a2 to the set,the size will not change
s.add(a2);
System.assertEquals(2,s.size()); // no duplicate element has been added to the set
这就是为什么你应该更喜欢原始类型或不可变对象而不是可变对象作为 Map 的键。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。