当前位置: 首页 > 知识库问答 >
问题:

如何过滤2个包含数百万个相同id项目的巨大列表[重复]

叶富
2023-03-14

这是我的2个清单上有超过百万的项目。两者都具有相同ID的相同项。ID在字符串中。我只需要一个不一样的ID的项目。我是这样做的。但我确信一定有更好的解决办法,而且具有高度的持久性:-

    List<Transaction> differentList = new ArrayList<>();

    for(Transaction tx : foundTransactions ){
        for(Transaction aTx : ArchivedTransactions) 
        {
            if(!tx.getId().equalsIgnoreCase(aTx.getId()) ){
                differentList .add(tx);
            }
        }
    }

我尝试使用流,但我做不到。我想用流API应该更好。请建议我有什么改进之处。

共有1个答案

彭飞虎
2023-03-14

您可以先尝试将其转换为hashmap,如下所示:

Set<String> collect = ArchivedTransactions.stream().map(i -> i.getId().toLowerCase())
                                           .collect(Collectors.toSet());

for(Transaction tx : foundTransactions )
    if(!collect.contains(tx.getId()))
       differentList.add(tx);

Collectors.toset()返回散列集。您可以将代码简化为:

Set<String> collect = ArchivedTransactions.stream().map(i -> i.getId().toLowerCase())
                                          .collect(Collectors.toSet());

List<Transaction> differentList = foundTransactions.stream()
                                                   .filter(tx -> !collect.contains(tx.getId()))
                                                   .collect(Collectors.toList())

首先将ID添加到hashset中作为中间步骤,将为您提供更好的总体复杂性时间,因为(源代码):

HashSet操作的时间复杂性:HashSet的底层数据结构是Hashtable。因此,对哈希集的add、remove和look-up(contains method)操作的摊销(平均或通常情况)时间复杂度需要O(1)次。

因此,“hashmap”解决方案的总体时间复杂性将为O(N+M),其中NM分别从列表ArchivedTransactionsFoundTransactions中的元素数开始。尽管如此,space-wise您将为拥有这种额外的结构付出代价。

您的解决方案space-wise更好,但时间复杂度最差。如果N=m则解决方案的时间复杂度为O(N^2),而具有哈希集的解决方案将为O(2N),因此为O(N)。这是一个巨大的差异。

做的只是

Set<Transaction> result = new LinkedHashSet<>();
result.addAll(foundTransactions);
result.addAll(ArchivedTransactions);

光靠自己是不行的,因为你明确要求:

!tx.getId().equalsIgnoreCase(aTx.getId())
 类似资料:
  • 问题内容: 我有一套文件,例如 如标题中所述:是否可以使用Nest过滤包含给定标签的所有文档? 例如,上面的记录将匹配[‘c’,’d’] 还是应该手动构建多个“ OR”? 问题答案: 编辑:下面的位集可能是有趣的读物,但答案本身有点过时。 其中一些功能在2.x中有所变化。Slawek还在另一个答案中指出,在这种情况下,查询是使搜索干燥的一种简便方法。最后重构为当前最佳实践。—nz 您可能需要带有子

  • 问题内容: a = [1,1,1,2,3,4,4] >>> b = [1,1,2,3,3,3,4] 请注意,这不是一个相同的问题: 两个列表的Python交集保持重复 因为即使列表a中有三个1,列表b中也只有两个,所以结果应该只有两个。 问题答案: 您可以使用此方法,当您使用交叉路口时,它将为每个元素提供在任一列表中找到的最低计数。 输出 :

  • 问题内容: 我正在为Java中的ERP系统进行定制。在我的定制中,我想使用Apache POI 3.10.1。因此,我集成了jars poi-3.10.1-20140818.jar和poi-ooxml-3.10.1-20140818.jar。 但是,这些jar包含几个类,这些类已经包含在ERP系统的核心代码中,但是有所不同。 如果核心ERP类覆盖POI类,则定制将引发运行时异常。如果POI类覆盖核

  • 问题内容: 语境 我正在为该类编写一个简单的 JUnit 测试。 阿可以从静态工厂方法,需要一个可变参数的创建 字符串 。 在的存在期间的任何时间,客户端可以检查它通过在的形式创建的参数 列表 ,通过方法。 换句话说,a 既记住并公开了使之成为现实的参数列表。有关此合同的更多详细信息: 的顺序将与为对象创建选择的顺序相同 允许重复的后续 String 组件并按顺序保留 行为未定义(其他代码保证没有

  • 问题内容: 这个问题已经在这里有了答案 : 循环“忘记”以删除一些项目[重复] (10个答案) 6年前关闭。 我想从列表“ a”中删除项目,其中列表“ b”包含在列表“ a”中找到带有单词的项目 结果应为: 这是因为在列表“ a”的项目中找到了单词“二”和“五六”。 这是我尝试解决的方法: 返回: 为什么这不起作用,如何解决此问题? 谢谢。 问题答案: 遍历列表时,请勿修改列表。这样做会产生不良的

  • 本文向大家介绍Python中包含重复项的两个列表的区别,包括了Python中包含重复项的两个列表的区别的使用技巧和注意事项,需要的朋友参考一下 有时我们需要找出两个列表之间的差异。这还将意味着数学减法,其中如果第二列表中存在元素,则将其从第一列表中删除。重复项将保留。以下是我们可以实现此目标的方法。 我们可以使用collections模块中的Counter方法,该方法将跟踪元素的计数。直接的数学减