You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从超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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 12:36:04