V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cryboy007
V2EX  ›  问与答

二个集合都是 28-30 万数据,过滤很慢

  •  
  •   cryboy007 · 2021-04-27 16:56:11 +08:00 · 962 次点击
    这是一个创建于 1306 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个需求,因为涉及到了二个集合比较,二个集合都是 28-30 万数据,后续可能一个集合的数据会增加。 使用下面的方式去过滤,竟然 2 个小时都没返回,因此我想使用 removeAll 的方式。但是无法重写 equals 啊。想知道有没有特殊的写法。有大佬知道还有啥子效率高的写法么...

    if (ArrayUtil.isEmpty(list2) || ArrayUtil.isEmpty(list1)) {
                return list1;
            }
    
            List<Map> copyList = new ArrayList<>(list1);
    
            //可能会有重复数据
            Iterator<Map> it = copyList.iterator();
            while (it.hasNext()) {
                boolean flag = false;
                Map map = it.next();
                for (Map sendMap : list2) {
                    if (PartTool.getString(map, key, null).equals(PartTool.getString(sendMap, key, null))) {
                        flag = true;
                        break;
                    }
                }
                /** false ,  true
                 * 1.拿要插入的跟查出来的做比较 如果相同则从集合中剔除
                 *   true,false
                 * 2.拿查询出来的根要插入的做比较 删掉一样的数据
                 */
                if (isDeleted && flag){
                    //如果不存在则剔除
                    it.remove();
                }else if (!isDeleted && flag) {
                    //如果相同则不增加
                    it.remove();
                }
                /*if (flag) {
                    it.remove();
                }*/
            }
            return copyList;
            
            
     现在改成了这样
     
     
      List<Map> reduceList = list1.stream().parallel().filter(item -> {
                for (Map b : list2) {
                    return !b.get("INTERCEPT_ACCOUNT").equals(item.get("INTERCEPT_ACCOUNT"));
                }
                return true;
            }).collect(toList());
            return reduceList;
    
    7 条回复    2021-04-27 18:06:28 +08:00
    cryboy007
        1
    cryboy007  
    OP
       2021-04-27 17:05:13 +08:00
    换成下面那种,现在只要 10 秒不到了。舒服
    dqzcwxb
        2
    dqzcwxb  
       2021-04-27 17:13:19 +08:00
    还以为是双重循环改 map,结果还是笛卡尔积拉满改成并行
    skyleft
        3
    skyleft  
       2021-04-27 17:13:45 +08:00
    改成的那个是不是有 bug 啊
    cryboy007
        4
    cryboy007  
    OP
       2021-04-27 17:19:45 +08:00
    @skyleft 嗯,我刚随便试下。。尴尬了
    cryboy007
        5
    cryboy007  
    OP
       2021-04-27 17:24:50 +08:00
    @skyleft 这样子应该可以了。感觉还是挺菜的写法
    ```java
    List<Map> reduceList = list1.stream().parallel().filter(item -> {
    boolean flag = true;
    a: for (Map b : list2) {
    if (b.get("INTERCEPT_ACCOUNT").equals(item.get("INTERCEPT_ACCOUNT"))) {
    flag = false;
    break a;
    }
    }
    return flag;
    }).collect(toList());
    return reduceList;
    ```
    @dqzcwxb ..想不到好办法
    dqzcwxb
        6
    dqzcwxb  
       2021-04-27 17:37:39 +08:00
    cryboy007
        7
    cryboy007  
    OP
       2021-04-27 18:06:28 +08:00
    @dqzcwxb 谢谢大佬,我等会儿试试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   978 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:55 · PVG 03:55 · LAX 11:55 · JFK 14:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.