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

2021-04-27 16:56:11 +08:00
 cryboy007

有一个需求,因为涉及到了二个集合比较,二个集合都是 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;
977 次点击
所在节点    问与答
7 条回复
cryboy007
2021-04-27 17:05:13 +08:00
换成下面那种,现在只要 10 秒不到了。舒服
dqzcwxb
2021-04-27 17:13:19 +08:00
还以为是双重循环改 map,结果还是笛卡尔积拉满改成并行
skyleft
2021-04-27 17:13:45 +08:00
改成的那个是不是有 bug 啊
cryboy007
2021-04-27 17:19:45 +08:00
@skyleft 嗯,我刚随便试下。。尴尬了
cryboy007
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
2021-04-27 17:37:39 +08:00
cryboy007
2021-04-27 18:06:28 +08:00
@dqzcwxb 谢谢大佬,我等会儿试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/773644

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX