将大列表与Java中的另一个小列表进行比较的最佳方法?

Posted

技术标签:

【中文标题】将大列表与Java中的另一个小列表进行比较的最佳方法?【英文标题】:Best way to compare a big list with another small list in java? 【发布时间】:2016-04-15 08:10:48 【问题描述】:

假设我有一个 listA[String] 有 200 万条记录,另一个 listB 有 20000 条记录。 我想比较和检查listB 中有多少元素不包含在listA 中。

非常基本的方法是listA.contains(listB[i])。但是对于 2 万条记录,它将遍历 listA 2 万次,时间复杂度为 O(n*n)。

有没有更好的方法呢?

【问题讨论】:

拿 listB 并考虑如何使用不同的数据结构来表示它。可以使用 hashmap 或 hashset 吗? @MichaelXu : 你能准确解释一下你想说什么吗? @MichaelXu 但也许他没有可用的空间。另一种选择是按字母顺序对两个列表进行排序,然后遍历列表并进行比较。 如果他有空间,我希望 hashmap 是去这里的方式。很高兴在 SO 上与您互动。 可能是BloomFilter 【参考方案1】:

您可以使用HashSet(或LinkedHashSet,如果元素的顺序很重要)。 Set 是一个不包含重复元素的集合,插入/搜索比在 List 中搜索要快得多。您将需要实现 equalshashCode 方法。

如果您需要List,您可以在搜索后将其转换回来:

List<Object> list = new ArrayList<Object>(hashset);

【讨论】:

以上是关于将大列表与Java中的另一个小列表进行比较的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

列表拆分:如何将大列表变成多个小列表

将大字符串中的子字符串匹配到大量关键字的最佳方法是啥

使用熊猫将列表中的单词与频率列表中的单词进行比较

将每个元素与列表中的其他元素进行比较

如何通过比较字符串出现的位置来对字符串列表进行排序?

如何比较 CRM 2016 中的两个方列表