如何从超5万行CSV文件计算租房成本最高区县的Java实现问题
代码核心问题
- 循环结构错位:匹配到符合价格区间的房源后,会遍历全量区县列表、全量最短停留时长列表,没有把同一房源的字段绑定关联,5万条数据规模下会形成O(n³)的笛卡尔积计算,结果完全失真,性能极差。
- 变量未定义:代码使用的
nightsPermitted没有声明,编译直接报错,实际对应的数据是存储在minimumStay列表中的最短停留时长值。 - 平均值逻辑错误:循环内每匹配一条数据就做一次
temp / countyCount累加的操作,属于错误的滑动平均计算。正确逻辑是累计所有符合条件的房源总租金,最后除以有效房源总数。 - 索引管理冗余:同时用增强for循环遍历房价列表、手动维护
count索引,极易出现遍历元素和索引错位的问题。 - 列表结构有隐式风险:四个独立ArrayList分别存储房源的不同字段,没有长度校验,一旦CSV解析时某行数据缺失,四个列表的索引对应关系就会断裂,后续计算全部错误。
修正后的单区县平均租金计算代码
public int calculateAvgCountyPrice(String targetCounty) { // 前置校验所有列表长度一致,避免索引错位 if (county.size() != costOfBuildings.size() || county.size() != minimumStay.size()) { throw new IllegalStateException("房源数据列表长度不一致,请检查CSV读取逻辑"); } int totalRent = 0; int validCount = 0; int minPrice = controller.getMin(); int maxPrice = controller.getMax(); // 按统一索引遍历,保证同一索引对应同一条房源的所有字段 for (int i = 0; i < county.size(); i++) { int unitPrice = costOfBuildings.get(i); // 跳过不在用户指定价格区间的房源 if (unitPrice < minPrice || unitPrice > maxPrice) { continue; } // 跳过非目标区县的房源 if (!county.get(i).equals(targetCounty)) { continue; } // 按规则计算单条房源总租金:最低停留时长 × 单价 int minStay = minimumStay.get(i); totalRent += minStay * unitPrice; validCount++; } // 避免除以0异常 return validCount == 0 ? 0 : totalRent / validCount; }
后续扩展最高成本区县的优化方案
后续要筛选全量数据中平均租房成本最高的区县时,不需要多次循环遍历,可以在单次全量遍历过程中,用HashMap同步维护每个区县的累计总租金、有效房源数,一遍遍历完成所有统计后,再计算各区县的平均租金并筛选最大值即可,5万条数据规模下无性能压力。
内容的提问来源于stack exchange,提问作者user15391371
相关产品推荐
相关产品推荐

