java - 在Java中找到两个大(大小~900K)字符串 vector 之间的孤儿的最快方法是什么?

标签 java optimization vector arraylist collections

我目前正在开发一个需要处理大量数据的 Java 程序。我有两个 vector ...

        Vector collectionA = new Vector();
        Vector collectionB = new Vector();

...在处理过程中它们都将包含大约 900,000 个元素。

我需要找到collectionB中不包含在collectionA中的所有项目。现在,我就是这样做的:

        for (int i=0;i<collectionA.size();i++) {
            if(!collectionB.contains(collectionA.elementAt(i))){
                // do stuff if orphan is found
            }
        }

但这会导致程序运行很长时间,这是 Not Acceptable 。

有什么方法可以调整它,以便我可以显着缩短运行时间吗?

我想我读过一次,使用 ArrayList 而不是 Vector 更快。使用 ArrayLists 而不是 Vectors 对解决这个问题有帮助吗?

最佳答案

使用 HashSet 进行查找。

说明:

当前,您的程序必须测试 CollectionB 中的每个项目,看看它是否等于当前正在处理的 CollectionA 中的项目(contains() 方法需要检查每个项目)。

你应该这样做:

Set<String> set = new HashSet<String>(collectionB);

for (Iterator i = collectionA.iterator(); i.hasNext(); ) {
  if (!set.contains(i.next())) {
    // handle
  }
}

使用 HashSet 会有所帮助,因为该集合将为每个元素计算哈希,并将该元素存储在与一系列哈希值关联的存储桶中。当检查某个项目是否在集合中时,该项目的哈希值将直接标识该项目应该位于哪个桶中。现在只需检查该桶中的项目即可。

使用像 TreeSet 这样的 SortedSet 也会比 Vector 有所改进,因为要找到项目,只需找到它所在的位置检查小费,而不是检查所有位置。哪种 Set 实现效果最好取决于数据。

关于java - 在Java中找到两个大(大小~900K)字符串 vector 之间的孤儿的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26291071/

相关文章:

c++ - 在 vector 使用中找不到 fatal error

java - Log4j2.properties 中的故障转移配置

java - Apache CSV 解析器 : Issue with ignoring empty lines

java - Java 中的随机数生成器

optimization - 如何在 ocaml 中将 Flambda 与沙丘一起使用?

sql - USPS 统一费率盒需要成本最小化算法

sql-server - 日期相关性的优化不会改变计划

java - eclipse 中的可执行 jar 无法使用包内的图像...有时

java - 使用类名从 Java Vector 检索对象

返回 Vec<&str> 时字符串的生命周期