吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 588|回复: 17
收起左侧

[求助] 关于java list求助

  [复制链接]
dmvip 发表于 2023-5-31 10:17
本帖最后由 dmvip 于 2023-5-31 10:30 编辑

[Java] 纯文本查看 复制代码
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
[Java] 纯文本查看 复制代码
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);
}
[/mw_shl_code]
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被回填了。

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

主要还是要 提取 集合 的 数据差异
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-25 08:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表