最近优化了一个需求,从原来的1小时到现在的只需要8秒!
因为数据在两个表,需要查询两次,然后合并两个集合的不同数据,于是有了这个需求。
一开始想到的方法是遍历小集合的每一个元素,然后在大集合中删除和当前小集合的元素中相同id的元素。用到了removeIf方法,但是执行下来发现1百多万的数据操作用了1个小时,这是无法忍受的。本想着也就是一个for循环啊,怎么会这么慢,于是查看了一下List的removeIf方法,没想到这个方法还是循环集合中的每一个元素,找到符合条件的然后删除。这和外面的for循环组合起来其实是一个双层for循环,所以才导致这么慢。于是就想着能不能一遍循环解决。
思考了一下,其实我本质要解决的问题是要把大集合中和小集合元素id值相同的删掉,那我可以循环大集合,然后看每一个id是否在小集合中有,如果有就删除,这样就相当于一个循环解决了。那么怎么看当前元素的id在小集合中有没有呢,这让我们想到了set集合,它可以做的事就是判断元素是否重复。重复的元素就不能添加进set集合,所以我们利用这个特性,先把小集合的所有元素的id放到一个set集合中,这个通过stream的map方法可以很容易的转换。
然后我们再遍历大集合的每一个元素,把当前元素的id值加入集合,如果加入失败,说明此id已经在小集合中出现过了,所有我们就需要删掉当前元素。通过这种方法,时间复杂度是O(M+N),比原来的O(M*N)小的不仅是一个数量级。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!