我有一个程序可以从网站查找数百个类别,每个类别从每个类别的许多产品的产品详细信息页面中获取数据
每个类别我都是从类似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个字符的字符串,混合字母和数字。不确定它是否会产生很大的不同。
答案 0 :(得分:5)
只需使用HashSet<Id>
代替数组:
这个类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设散列函数在桶之间正确地分散元素。
如果您的Id
实施的密集程度不是hashcode
/ equals
,则10k项目根本不会成为问题,例如,如果您的ID为{ {1}}。
另外请记住,如果您访问网页并执行数据库调用,那么在Java代码中花费的时间很可能是微不足道的:大部分时间都花在等待外部调用返回上。