我的程序是匹配Craigslist美国网站,并从美国邮政编码文件中为其分配邮政编码。首先它读取包含美国邮政编码和适当城市的zipcode文件。阅读完每个条目后,它会检查craigslist网站的源代码,以查找该城市的匹配项。如果找到匹配项,程序会将该zipcode分配给该URL,并将URL和zipcde插入mySQL数据库。但是一旦它读取了大约30,000个zipcodes,该程序就会落后很多。
我已经包含了我的代码,用于比较邮政编码,如果找到匹配,则会将其插入数据库:
String sql = "SELECT city, state FROM CRAIGSLIST";
ResultSet rs = con.createStatement().executeQuery(sql);
while(rs.next()) {
String state = rs.getString("state");
String city = rs.getString("city");
if((city.equalsIgnoreCase(cityInFile)) && (state.equalsIgnoreCase(stateInFie))){
sql = "UPDATE CRAIGSLIST "+ " SET zipcode = '"+ZipCode+"' WHERE city = '"+city+"'" ;
con.createStatement().executeUpdate(sql);
System.out.println("Found a match!");
break;
}
}
有人请帮忙。谢谢
答案 0 :(得分:1)
您可以线性扫描30k记录以查找单个匹配项。
创建一个hashtablemap,其中cityInFile是键,stateInFile是值。然后循环遍历结果集,并根据哈希表检查每个城市。
你正在做O(n ^ 2)工作以找到你的比赛。如果您对文件进行哈希处理,则会将工作减少到O(n),因为您将在固定时间内进行n次搜索。
if hashtable.get(cityInFile).equals(state)
//match found
您可以做的另一个解决方案是遍历您的文件并为每个cityInFile发出单独的查询以检查它是否存在,然后查看状态是否匹配。它只需要你在SQL语句中添加一个where子句。
答案 1 :(得分:0)
可能是您的CRAIGLIST表没有按城市划分的索引,因此当您添加新记录时,性能会下降,因为它必须查看所有记录才能找到该城市。
答案 2 :(得分:0)
不是每次都获取数据库中的所有记录,而是尝试使用SELECT语句中的WHERE子句将结果限制为与城市和州匹配的结果:
String sql = "SELECT city, state FROM CRAIGSLIST " +
"WHERE UPPER(city) = '" + cityInFile.toUpperCase() +
"', UPPER(state) = '" + stateInFile.ToUppderCase + "'";