Java 昼伏夜出车辆过滤算法实现

本文介绍一种基于 Java 的算法,用于根据过车记录集合,过滤出符合昼伏夜出条件的车辆。

算法描述

  1. 输入参数:

    • vehicleList: 过车记录集合,每个元素包含 hpzl (号牌种类), hphm (号牌号码), gcsj (过车时间) 等属性。
    • startTime: 开始时间,例如 2023-04-01
    • endTime: 结束时间,例如 2023-04-10
    • dayTimeStart: 白天时间段开始时间,例如 06:00
    • dayTimeEnd: 白天时间段结束时间,例如 18:00
    • ratio: 昼伏夜出比例阈值,例如 30%
  2. 过滤逻辑:

    • 遍历每一天的过车记录。
    • 对于每辆车,统计它在当天白天和晚上各有多少次过车记录。
    • 如果该车辆在当天晚上有过车记录但是白天没有,则计算它在所有天数中的过车记录次数。
    • 计算昼伏夜出比例,即所有天数的过车记录次数除以统计条件中的开始和结束时间相差的天数。
    • 如果比例大于 ratio,则将该车辆的过车记录添加到新的集合中。
  3. 返回值:

    • 包含符合昼伏夜出条件的车辆过车记录的集合。

代码实现

public List<AnalysisJudgmentVehicleVO> filterNightOutVehicles(List<AnalysisJudgmentVehicleVO> vehicleList, String startTime, String endTime, String dayTimeStart, String dayTimeEnd, double ratio) {
    // 用于存储符合条件的过车记录的集合
    List<AnalysisJudgmentVehicleVO> filteredList = new ArrayList<>();

    // 将开始时间和结束时间转换为日期格式
    LocalDate startDate = LocalDate.parse(startTime);
    LocalDate endDate = LocalDate.parse(endTime);

    // 遍历每一天
    for (LocalDate date = startDate; date.isBefore(endDate.plusDays(1)); date = date.plusDays(1)) {
        // 用于存储当天已经检查过的车辆的记录,避免重复计算
        Set<String> checkedVehicles = new HashSet<>();

        // 将当天的开始时间和结束时间转换为LocalDateTime格式
        LocalDateTime dayStart = LocalDateTime.of(date, LocalTime.parse(dayTimeStart));
        LocalDateTime dayEnd = LocalDateTime.of(date, LocalTime.parse(dayTimeEnd));

        // 遍历每辆车的过车记录
        for (AnalysisJudgmentVehicleVO vehicle : vehicleList) {
            // 如果该车辆已经检查过,跳过
            if (checkedVehicles.contains(vehicle.getHphm() + vehicle.getHpzl() + date.toString())) {
                continue;
            }

            // 统计该车辆在当天的白天和晚上各有多少次过车记录
            int dayCount = 0;
            int nightCount = 0;
            for (AnalysisJudgmentVehicleVO v : vehicleList) {
                LocalDateTime time = LocalDateTime.parse(v.getGcsj(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

                if (v.getHphm().equals(vehicle.getHphm()) && v.getHpzl().equals(vehicle.getHpzl())) {
                    if (time.isAfter(dayStart) && time.isBefore(dayEnd)) {
                        dayCount++;
                    } else {
                        nightCount++;
                    }
                }
            }

            // 如果该车辆在当天晚上有过车记录但是白天没有,次数+1
            if (nightCount > 0 && dayCount == 0) {
                int totalCount = nightCount;
                for (LocalDate d = startDate; d.isBefore(endDate.plusDays(1)); d = d.plusDays(1)) {
                    if (!d.equals(date)) {
                        LocalDateTime start = LocalDateTime.of(d, LocalTime.parse(dayTimeStart));
                        LocalDateTime end = LocalDateTime.of(d, LocalTime.parse(dayTimeEnd));
                        for (AnalysisJudgmentVehicleVO v : vehicleList) {
                            if (v.getHphm().equals(vehicle.getHphm()) && v.getHpzl().equals(vehicle.getHpzl())) {
                                LocalDateTime time = LocalDateTime.parse(v.getGcsj(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                                if (time.isAfter(start) && time.isBefore(end)) {
                                    totalCount++;
                                    break;
                                }
                            }
                        }
                    }
                }

                // 计算昼伏夜出比例,如果大于ratio,将过车数据添加到新集合中
                double dayNightRatio = (double) totalCount / (double) (endDate.toEpochDay() - startDate.toEpochDay() + 1);
                if (dayNightRatio > ratio) {
                    filteredList.add(vehicle);
                }
            }

            // 将该车辆标记为已经检查过
            checkedVehicles.add(vehicle.getHphm() + vehicle.getHpzl() + date.toString());
        }
    }

    return filteredList;
}

总结

该算法通过遍历过车记录集合,统计每辆车在白天和晚上的过车次数,并计算昼伏夜出比例。最终返回一个包含符合条件的车辆过车记录的集合。该算法可以应用于交通管理、安全监控等领域,用于识别可能存在异常行为的车辆。


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

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