快速重复搜索快速增长阵列中是否存在价值的最佳方法?

时间:2015-08-19 14:57:38

标签: java arrays

我有一个程序可以从网站查找数百个类别,每个类别从每个类别的许多产品的产品详细信息页面中获取数据

每个类别我都是从类似800类别的表中的SELECT中获取它们,然后我从每个类别获得100个产品。

问题是这些产品中有许多属于多个类别,所以我试图在我的代码中设置一个方法,如果我之前已经抓过该产品(在另一个类别中),请不要转到产品详细信息页面

所以代码在概念上会是这样的:

thesql = "SELECT catid from categories";

ResultSet rs = statement.executeQuery(thesql);

while (rs.next())
{
  > go check the website for this particular catid

  > loop to check all products in this page      
    > for each productid listed in this category's page:
       > check array to see if we have encountered this productid before(in
         this session)
          > if we have, skip this product and continue with next one
          > if we haven't, go to this product's detail web page, grab its
            data, insert it in database, and add this productid in our array.
 }

我有两个问题:

1)每次传递都必须将一个产品ID添加到如此大的数组中,并且还必须每次搜索以查看当前产品ID是否预先存在于数组中,这会产生适得其反或太耗费资源吗?(数组)可能最终得到2000-6000项)

2)如果有多种方法可以解决,你推荐的方式是什么?

(请注意我对java数组有很好的经验,但我理解这个概念)

我知道我可以使用" INSERT IGNORE INTO ..."当插入数据库表以确保我不会插入重复项时,但我想节省检查我已经检查过的产品网站所需的时间和资源。

非常感谢!

编辑/更新:我忘了提到productid不是数字,而是10个字符的字符串,混合字母和数字。不确定它是否会产生很大的不同。

1 个答案:

答案 0 :(得分:5)

只需使用HashSet<Id>代替数组:

  

这个类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设散列函数在桶之间正确地分散元素。

如果您的Id实施的密集程度不是hashcode / equals,则10k项目根本不会成为问题,例如,如果您的ID为{ {1}}。

另外请记住,如果您访问网页并执行数据库调用,那么在Java代码中花费的时间很可能是微不足道的:大部分时间都花在等待外部调用返回上。