关于java list求助
本帖最后由 dmvip 于 2023-5-31 10:30 编辑List<Beans> list1 = new ArrayList<>();
list1.add(new Beans("1","你好了"));
list1.add(new Beans("2","呵呵哒"));
list1.add(new Beans("3","啦啦啦啦"));
list1.add(new Beans("4","啦啦啦啦22"));
List<Beans> list2 = new ArrayList<>();
list2.add(new Beans("1","你好了1"));
list2.add(new Beans("2","呵呵哒"));
list2.add(new Beans("3","啦啦啦啦3"));
list2.add(new Beans("4","啦啦啦啦22232322323"));
list2.add(new Beans("5","555555"));
list2.add(new Beans("666","6666"));
List<Beans> upData = new ArrayList<>();// 更新的数据
List<Beans> addData = new ArrayList<>();// 新增数据
public static class Beans {
private String id;
private String name;
}
///我现在需要 根据list1 和 list2拿到 更新的数据 和新增的数据
其中更新的数据: list2: Beans("1","你好了1") Beans("3","啦啦啦啦3") Beans("4","啦啦啦啦22232322323")
其中新增的数据:list2: Beans("5","555555") ,Beans("666","666")
-------------------------------------------------------------
代码应该如何实现 把更新的数据添加到 upData ,把新增的数据添加到addData for (Beans beans2 : list2) {
boolean exist = false;
for (Beans beans1 : list1) {
if (beans2.getId().equals(beans1.getId())) {
// 如果 id 相等,说明是更新的数据
if (!beans2.getName().equals(beans1.getName())) {
// 只有在 name 不相等时才添加到更新数据列表中
upData.add(beans2);
}
exist = true;
break;
}
}
if (!exist) {
// 如果不存在,则说明是新增的数据
addData.add(beans2);
}
}
首先遍历 list2 中的每一个 Beans 对象,然后再遍历 list1 中的每一个 Beans 对象,通过比对 id 是否相等来判断两个 Beans 对象是否为同一个对象。如果是同一个对象,再判断 name 是否相等,如果不相等,则将该 Beans 对象添加到 upData 列表中。如果搜索完 list1 后,没有找到与之相同 id 的 Beans 对象,说明该 Beans 对象为新增数据,添加到 addData 列表中即可。(ChatGpt回答的) 本帖最后由 pjy612 于 2023-5-31 11:01 编辑
1.先用笨办法写两个循环实现吧。
2.再优化,如果类中有唯一性字段,可以 根据 那个字段 把 list1 转成 HashMap 啥的。这样能省一层循环。
3.自己实现后 再去找 看有什么工具库 能根据 自定义回调 求 两个集合之间的 差集(新增的数据),和 交集(可能修改的数据),然后再在交集中针对性 判断是否变更。(实际上还是 方案2 的步骤)
4.一步到胃,直接用 stream(伪代码 没 ide)
list2.filter(list1.allMatch(id==id )==false )(新增的数据)
list2.filter (list1.anyMatch( id==id && name!=name ) )(修改的数据)
什么的 直接查出来。(性能上 就不清楚了,如果结合方案2的话 可能快很多)
pjy612 发表于 2023-5-31 10:37
1.先用笨办法写两个循环实现吧。
2.再优化,如果类中有唯一性字段,可以 根据 那个字段 把 list1 转成 H ...
好的 感谢 大哥 双层循环耗性能的很 。 只要是 new 出来的 , 都是 新对象, 而且 ArrayList 也不能去重复, 所以你重写 hashcord eq 也没用
建议用 hashmap 手动判断 可以使用循环遍历的方式进行比较和判断
List<Beans> list1 = new ArrayList<>();
list1.add(new Beans("1","你好了"));
list1.add(new Beans("2","呵呵哒"));
list1.add(new Beans("3","啦啦啦啦"));
list1.add(new Beans("4","啦啦啦啦22"));
List<Beans> list2 = new ArrayList<>();
list2.add(new Beans("1","你好了1"));
list2.add(new Beans("2","呵呵哒"));
list2.add(new Beans("3","啦啦啦啦3"));
list2.add(new Beans("4","啦啦啦啦22232322323"));
list2.add(new Beans("5","555555"));
list2.add(new Beans("666","6666"));
List<Beans> upData = new ArrayList<>(); // 更新的数据
List<Beans> addData = new ArrayList<>(); // 新增的数据
// 遍历 list2,判断每个元素是否存在于 list1
for (Beans bean : list2) {
boolean found = false;
for (Beans existingBean : list1) {
if (bean.id.equals(existingBean.id)) {
found = true;
// 如果 id 相同,判断 name 是否相同,不相同则认为是更新的数据
if (!bean.name.equals(existingBean.name)) {
upData.add(bean);
}
break;
}
}
// 如果在 list1 中未找到对应的元素,认为是新增的数据
if (!found) {
addData.add(bean);
}
}
// 输出更新的数据
System.out.println("更新的数据:");
for (Beans bean : upData) {
System.out.println(bean.id + " - " + bean.name);
}
// 输出新增的数据
System.out.println("新增的数据:");
for (Beans bean : addData) {
System.out.println(bean.id + " - " + bean.name);
}
转map,然后对比就完事了 你这设计不合理,应该是更新才带id,新增不带id,新增不带id,新增不带id 本帖最后由 pjy612 于 2023-5-31 11:09 编辑
TabKey9 发表于 2023-5-31 11:02
你这设计不合理,应该是更新才带id,新增不带id,新增不带id,新增不带id
就当他是 插入或更新 完毕后,id被回填了。
现在要收集具体哪些数据异动了,写日志啥的。
主要还是要 提取 集合 的 数据差异
{:301_978:}
页:
[1]
2