java - 一旦读取大约 30,000 个邮政编码,程序就会出现滞后

标签 java mysql while-loop

我的程序是匹配 Craigslist 美国网站并从美国邮政编码文件为其分配邮政编码。首先,它读取包含美国邮政编码和相应城市的邮政编码文件。阅读每个条目后,它会检查 craigslist 网站的源代码以查找城市的匹配项。如果找到匹配项,程序会将该邮政编码分配给该 url,并将该 URL 和 zipcde 插入到 mySQL 数据库中。但一旦读取到大约 30,000 个邮政编码,程序就会出现很大的滞后。

我已经包含了比较邮政编码的代码,如果找到匹配项,则将其插入数据库:

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;                  
    }
}

请有人帮忙。谢谢

最佳答案

您需要线性扫描 30k 条记录来查找单个匹配项。

创建一个哈希表映射,其中 cityInFile 是键,stateInFile 是值。然后循环遍历结果集,并根据哈希表检查每个城市。

为了找到匹配项,您需要花费 O(n^2) 的时间。如果您对文件进行哈希处理,您将把工作量减少到 O(n),因为您将在恒定时间内执行 n 次搜索。

if hashtable.get(cityInFile).equals(state)
//match found

您可以做的另一个解决方案是循环遍历您的文件并对每个 cityInFile 发出单独的查询以检查它是否存在,然后查看状态是否匹配。它只需要您在 SQL 语句中添加一个 where 子句。

关于java - 一旦读取大约 30,000 个邮政编码,程序就会出现滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23551705/

相关文章:

java - 如何在android中生成随机事件?

mysql - SELECT * JOIN ON 主键 = 外键操作中的重复列?

php - MYSQL语句搞不明白是怎么回事

javascript - 使用 len 和 setter 续写密码验证失败

swift - 在下面的 Swift 代码中,为什么程序在到达 Break 时退出 while 循环?

linux - 将读取行转换为 awk

java - Android抽屉导航点击事件问题

java - 如果在 TableView JavaFx 中选择了多行,则禁用某些上下文菜单项

php - 如何使用 php 从选择查询中插入数据

java - 检查图形绘制的尺寸