gpt4 book ai didi

java - 多个 NULL 添加到 Java 中的列表中

转载 作者:行者123 更新时间:2023-11-29 06:32:12 27 4
gpt4 key购买 nike

我有 2 个列表,想将一些元素从一个列表复制到另一个列表,即有新旧员工列表,我需要合并 2 个列表并删除包含在旧列表中但不包含在新列表中的元素。

我可以通过使用 TreeSet 并覆盖 Employees 类的 equals 和 hashcode 函数来解决获取并集和交集的部分....

现在,我想排除旧元素而不是新元素并将它们添加到“deletedList”......我得到“ConcurrentModificationException”

我试过这个而不是“迭代器”,但结果相同:for(Employees e : employeesListDB)

我也试过“CopyOnWriteArrayList”而不是“ArrayList”,但没有任何变化!!

但现在的问题是,在初始化空列表“deletedList”时,它在添加函数之前填充了多个空元素!

代码如下:

List<Employees> employeesListDB = this.findAll();     

Set<Employees> empSet = new TreeSet<Employees>(new EmployeeComparator());
empSet.addAll(employeesList);

List<Employees> deletedList = new ArrayList<Employees>();
Employees e = new Employees();

ListIterator<Employees> itr = employeesListDB.listIterator();
for(itr.hasNext()) {
e = (Employees)itr.next();
if(!empSet.contains(e)) {
deletedList.add(e);
}
}

计数器示例:

oldlist "employeesListDB"数据库中的员工列表:

[  
{
"email":"mariam.moustafa@x.com"
},
{
"email":"sara.ahmed@x.com"
},
{
"email":"ali.hassan@x.com"
},
{
"email":"hoosen.imam-ally@x.com"
},
{
"email":"allan.randall@x.com"
},
{
"email":"nishaan.maharaj@x.com"
}
]

要添加的新列表:

[  
{
"email":"ali.moustafa@x.com"
},
{
"email":"sara.ahmed@x.com"
},
{
"email":"emad.hamed@x.com"
}

]

我想要的删除列表:

[
{
"email":"mariam.moustafa@x.com" }, {
"email":"ali.hassan@x.com" }, {
"email":"hoosen.imam-ally@x.com" }, {
"email":"allan.randall@x.com" }, {
"email":"nishaan.maharaj@x.com" } ]

Sara邮件会更新...

Employee 类有两个字段 {id,email} 新列表(要添加到数据库的列表)是一个只有电子邮件的列表,id 字段尚未被识别,但旧列表具有完整的 bean 字段.. .要在这两个列表之间进行比较,我应该重写 Comparator 以忽略 id 字段; Finding duplicates in a List ignoring a field

只是我需要知道,为什么当我使用 set.add 操作时,它只添加唯一的电子邮件!列表的原始大小是 36 个元素,将其添加到集合中后变为只有 16 个!

 Set<Employees> oldSet = new TreeSet<Employees>(new EmployeeComparator());
oldSet.addAll(employeesListDB);

Set<Employees> newSet = new TreeSet<Employees>(new EmployeeComparator());
newSet.addAll(employeesList);


Set<Employees> deleted = Sets.difference(oldSet, newSet);

最佳答案

据我了解,您需要旧集合中包含但新集合中不包含的所有元素。

为此,您可以使用 Guava Sets#difference方法:

Set<Employees> deleted = Sets.difference(oldSet, newSet);

用你的数据测试:

Set<String> oldEmployees = Sets.newHashSet("mariam.moustafa@x.com", "sara.ahmed@x.com", "ali.hassan@x.com", "hoosen.imam-ally@x.com", "allan.randall@x.com", "nishaan.maharaj@x.com");
Set<String> newEmployees = Sets.newHashSet("ali.moustafa@x.com", "sara.ahmed@x.com", "emad.hamed@x.com");

Set<String> diff = Sets.difference(oldEmployees, newEmployees);

System.out.println(diff);

结果:

[nishaan.maharaj@x.com, mariam.moustafa@x.com, ali.hassan@x.com, allan.randall@x.com, hoosen.imam-ally@x.com]

关于java - 多个 NULL 添加到 Java 中的列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30887149/

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