Java代码实现过车记录筛选:识别昼伏夜出车辆

假设我们拥有一个过车记录集合List<AnalysisJudgmentVehicleVO>,其中AnalysisJudgmentVehicleVO属性包含hpzl(号牌种类)、hphm(号牌号码)和gcsj(过车时间),均为String类型。现在需要根据以下统计条件,识别出昼伏夜出车辆并将其记录添加到新的集合中:

  • 开始时间:例如 2023-04-01
  • 结束时间:例如 2023-04-10
  • 时间段:06:00-18:00 为白天,其余时间为晚上
  • 昼伏夜出比例:例如 30%

计算要求:

  • 同一天同一辆车晚上有过车记录白天没有,即次数 + 1
  • 同一天号牌种类号牌号码相同的车辆只算一次
  • 每辆车在所有天数总的次数与统计条件中的开始、结束时间相差的天数计算比例,如比例大于统计条件的昼伏夜出比例,将过车数据添加到新集合中

解题思路:

  1. 创建一个新的集合用于存储满足条件的过车记录。
  2. 遍历原始的过车记录集合,对于每一条记录,提取出时间、车牌号和车牌种类等信息。
  3. 判断该车牌在同一天是否有白天和晚上两次过车记录,如果晚上有过车记录且白天没有,则次数加 1。
  4. 对于同一天同一辆车的情况,只计算一次。
  5. 对于每辆车,计算其所有天数内晚上有过车记录且白天没有的比例,如果大于昼伏夜出比例,则将该过车记录添加到新集合中。
  6. 返回新集合。

Java代码实现如下:

public List<AnalysisJudgmentVehicleVO> filterRecords(List<AnalysisJudgmentVehicleVO> records, String startTime, String endTime, double dayNightRatio) {
    List<AnalysisJudgmentVehicleVO> filteredRecords = new ArrayList<>();
    
    // 将开始时间和结束时间转换为日期类型
    LocalDate startDate = LocalDate.parse(startTime);
    LocalDate endDate = LocalDate.parse(endTime);

    // 遍历过车记录集合
    for (AnalysisJudgmentVehicleVO record : records) {
        // 提取出时间,车牌号和车牌种类等信息
        String timeStr = record.getGcsj();
        String hpzl = record.getHpzl();
        String hphm = record.getHphm();
        
        // 将过车时间转换为LocalDateTime类型
        LocalDateTime time = LocalDateTime.parse(timeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

        // 判断时间是否在统计时间段内
        if (time.toLocalTime().compareTo(LocalTime.of(6, 0)) >= 0 && time.toLocalTime().compareTo(LocalTime.of(18, 0)) < 0) {
            // 白天过车记录
            continue;
        }

        // 计算该车辆当天是否有白天过车记录
        boolean hasDayRecord = false;
        for (AnalysisJudgmentVehicleVO r : records) {
            if (r.getGcsj().startsWith(time.toLocalDate().toString()) && r.getHpzl().equals(hpzl) && r.getHphm().equals(hphm)) {
                if (time.toLocalTime().compareTo(LocalTime.of(6, 0)) < 0 || time.toLocalTime().compareTo(LocalTime.of(18, 0)) >= 0) {
                    // 晚上过车记录
                    continue;
                }
                hasDayRecord = true;
                break;
            }
        }

        // 如果晚上有过车记录且白天没有,则次数加 1
        if (!hasDayRecord) {
            record.setCnt(record.getCnt() + 1);
        }

        // 判断同一天同一辆车是否已经计算过
        boolean isDuplicate = false;
        for (AnalysisJudgmentVehicleVO r : filteredRecords) {
            if (r.getGcsj().startsWith(time.toLocalDate().toString()) && r.getHpzl().equals(hpzl) && r.getHphm().equals(hphm)) {
                isDuplicate = true;
                break;
            }
        }

        // 如果该车辆在所有天数内晚上有过车记录且白天没有的比例大于昼伏夜出比例,则将该过车记录添加到新集合中
        if (!isDuplicate) {
            int nightCount = 0;
            int totalCount = 0;
            for (AnalysisJudgmentVehicleVO r : records) {
                if (r.getHpzl().equals(hpzl) && r.getHphm().equals(hphm)) {
                    if (r.getGcsj().startsWith(time.toLocalDate().toString())) {
                        totalCount++;
                        if (r.getGcsj().compareTo(timeStr) < 0) {
                            // 晚上过车记录
                            nightCount++;
                        }
                    } else {
                        LocalDate rDate = LocalDate.parse(r.getGcsj());
                        if (rDate.isAfter(startDate) && rDate.isBefore(endDate)) {
                            totalCount++;
                            if (r.getGcsj().endsWith(' 23:59:59')) {
                                // 晚上过车记录
                                nightCount++;
                            }
                        }
                    }
                }
            }
            double ratio = (double) nightCount / totalCount;
            if (ratio > dayNightRatio) {
                filteredRecords.add(record);
            }
        }
    }

    return filteredRecords;
}

代码解析:

  1. 代码首先将开始时间和结束时间转换为LocalDate类型,并创建了一个新的集合filteredRecords用于存储满足条件的过车记录。
  2. 代码遍历原始的过车记录集合,对于每一条记录,提取出时间、车牌号和车牌种类等信息。
  3. 代码判断该车牌在同一天是否有白天和晚上两次过车记录,如果晚上有过车记录且白天没有,则次数加 1。
  4. 代码判断同一天同一辆车是否已经计算过,如果已经计算过,则跳过该记录。
  5. 代码计算该车辆在所有天数内晚上有过车记录且白天没有的比例,如果比例大于昼伏夜出比例,则将该过车记录添加到新集合中。
  6. 最后,代码返回新集合。

总结:

本文介绍了如何利用Java代码对过车记录进行筛选,识别出昼伏夜出车辆。该算法通过统计特定时间段内车辆白天和晚上的过车记录,计算出昼伏夜出比例,并将比例超过设定阈值的车辆记录添加到新的集合中。该算法可以有效地帮助用户识别昼伏夜出车辆,提高车辆管理效率。

Java代码实现过车记录筛选:识别昼伏夜出车辆

原文地址: https://www.cveoy.top/t/topic/nVYP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录