在Java中,在两个较大(大小约900K)的字符串向量之间查找孤立项的最快方法是什么?

在Java中,在两个较大(大小约900K)的字符串向量之间查找孤立项的最快方法是什么?,java,optimization,vector,arraylist,collections,Java,Optimization,Vector,Arraylist,Collections,我目前正在开发一个处理大量数据所需的Java程序。我有两个向量 Vector collectionA = new Vector(); Vector collectionB = new Vector(); …在加工过程中,它们都将含有约900000种元素 我需要找到collectionB中不包含在collectionA中的所有项目。现在,我就是这样做的: for (int i=0;i<collectionA.size();i++) {

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

        Vector collectionA = new Vector();
        Vector collectionB = new Vector();
…在加工过程中,它们都将含有约900000种元素

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

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

for(int i=0;i使用哈希集进行查找

说明:

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

你应该做:

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

for (Iterator i = collectionA.iterator(); i.hasNext(); ) {
  if (!set.contains(i.next())) {
    // handle
  }
}
Set Set=newhashset(collectionB);
for(迭代器i=collectionA.Iterator();i.hasNext();){
如果(!set.contains(i.next())){
//处理
}
}
使用HashSet会有所帮助,因为该集合将为每个元素计算一个哈希值,并将元素存储在与一系列哈希值关联的bucket中。当检查某个项是否在集合中时,该项的哈希值将直接标识该项应在其中的bucket。现在只需检查该bucket中的项


使用
分类数据集
树集
也比
向量
有所改进,因为要查找项目,只需检查项目所在的位置,而不是所有位置。哪个
实现效果最好取决于数据。

使用哈希集进行查找

说明:

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

你应该做:

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

for (Iterator i = collectionA.iterator(); i.hasNext(); ) {
  if (!set.contains(i.next())) {
    // handle
  }
}
Set Set=newhashset(collectionB);
for(迭代器i=collectionA.Iterator();i.hasNext();){
如果(!set.contains(i.next())){
//处理
}
}
使用HashSet会有所帮助,因为该集合将为每个元素计算一个哈希值,并将元素存储在与一系列哈希值关联的bucket中。当检查某个项是否在集合中时,该项的哈希值将直接标识该项应在其中的bucket。现在只需检查该bucket中的项


使用
SortedSet
类似
TreeSet
SortedSet也将是对
Vector
的改进,因为要查找项目,只需检查项目所在的位置,而不必检查所有位置。哪个
实现效果最好取决于数据。

如果元素的顺序无关紧要,我将我们将按照以下步骤进行:

Set<String> a = new HashSet<>();
Set<String> b = new HashSet<>();

// ...

b.removeAll(a):

在我的普通开发机器上,使用Oracle JDK 7,
TreeSet
变量大约比
HashSet
变量(~105ms)慢4倍(~450ms)。

如果元素的顺序无关紧要,我会选择,并按如下方式执行:

Set<String> a = new HashSet<>();
Set<String> b = new HashSet<>();

// ...

b.removeAll(a):

在我的普通开发机器上,使用Oracle JDK 7,
TreeSet
变量比
HashSet
变量(~105ms)慢4倍(~450ms).

如果值基数较低:保留两个集合。一个用于可乐,另一个用于可乐。每次添加/替换/删除每个集合中的内容时,都要更新这两个集合。使用它们来区分它们。如果基数较高,我不知道:-)将900T更改为900K。后者可能被读取为TB,我很确定你的向量不会那么大:-)lol paxdiablo我本来应该写900K,但选择了900T,因为我认为900K可能被读取为KB:pMike/Leo:tbh,这只是因为我不熟悉集合。但是如果使用集合可以大大提高我的运行时间,那么我将使用集合实现逻辑。谢谢如果瓶颈是比较本身(例如,您的集合包含难以比较的复杂对象):尝试使用一些更简单的数据表示法来优化比较(java已经通过object hashcode()实现了这一点,但您可能可以改进它)。如您所见,这个问题有许多假设:-)如果值基数较低:保留两个集。一杯可乐,一杯可乐。每次您添加/替换/删除每个集合中的内容时,都要更新这两个集合。用它们来分散它们。如果基数高,我不知道:-)将900T更改为900K。后者可能被读取为TB,我很确定你的向量不会那么大:-)lol paxdiablo我本来应该写900K,但选择了900T,因为我认为900K可能被读取为KB:pMike/Leo:tbh,这只是因为我不熟悉集合。但是如果使用集合可以大大提高我的运行时间,那么我将使用集合实现逻辑。谢谢如果瓶颈是比较本身(例如,您的集合包含难以比较的复杂对象):尝试使用一些更简单的数据表示法来优化比较(java已经通过object hashcode()实现了这一点,但您可能可以改进它)。正如你所看到的,这个问题有很多假设:-)谢谢你的建议。哈希集与哈希集不同吗?Mike和Leo建议使用集合,所以我只是想知道它们是否与Hashset相同provided@heisenbergman-HashSet是Set接口的一个实现(因此,是的,它们是不同的)。如果你愿意,你可以用TreeSet做实验。根据数据的“形状”,它可能比哈希集更快。谢谢你的建议。哈希集与哈希集不同吗?Mike和Leo建议使用集合,所以我只是想知道它们是否与Hashset相同provided@heisenbergman-HashSet是Set接口的一个实现(因此,是的,它们是不同的)。如果你愿意,你可以