dmvip 发表于 2023-5-31 10:17

关于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

r396517261 发表于 2023-5-31 10:27

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 10:37

本帖最后由 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的话 可能快很多)


dmvip 发表于 2023-5-31 10:40

pjy612 发表于 2023-5-31 10:37
1.先用笨办法写两个循环实现吧。

2.再优化,如果类中有唯一性字段,可以 根据 那个字段 把 list1 转成 H ...

好的 感谢 大哥

dmvip 发表于 2023-5-31 10:41

双层循环耗性能的很 。

Vvvvvoid 发表于 2023-5-31 10:45

只要是 new 出来的 , 都是 新对象, 而且 ArrayList 也不能去重复, 所以你重写 hashcord eq 也没用
建议用 hashmap 手动判断

yk156511 发表于 2023-5-31 10:53

可以使用循环遍历的方式进行比较和判断


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);
}

sunyx816 发表于 2023-5-31 11:01

转map,然后对比就完事了

TabKey9 发表于 2023-5-31 11:02

你这设计不合理,应该是更新才带id,新增不带id,新增不带id,新增不带id

pjy612 发表于 2023-5-31 11:07

本帖最后由 pjy612 于 2023-5-31 11:09 编辑

TabKey9 发表于 2023-5-31 11:02
你这设计不合理,应该是更新才带id,新增不带id,新增不带id,新增不带id
就当他是 插入或更新 完毕后,id被回填了。

现在要收集具体哪些数据异动了,写日志啥的。

主要还是要 提取 集合 的 数据差异
{:301_978:}
页: [1] 2
查看完整版本: 关于java list求助