public List calculate(List records, String startTime, String endTime, String dayStartTime, String dayEndTime, double dayNightRatio) {
List result = new ArrayList<>();
Map<String, Set> nightCars = new HashMap<>(); // 保存晚上有过车记录的车辆信息,key为日期,value为车辆号牌
Map<String, Set> dayCars = new HashMap<>(); // 保存白天有过车记录的车辆信息,key为日期,value为车辆号牌
Map<String, Set> allCars = new HashMap<>(); // 保存每天所有有过车记录的车辆信息,key为日期,value为车辆号牌
Map<String, Integer> nightCount = new HashMap<>(); // 保存晚上有过车记录但白天没有的车辆数,key为日期,value为数值
Map<String, Integer> totalCount = new HashMap<>(); // 保存每天所有有过车记录的车辆数,key为日期,value为数值
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date start = sdf.parse(startTime + " " + dayStartTime + ":00:00");
Date end = sdf.parse(endTime + " " + dayEndTime + ":00:00");
long dayDiff = (end.getTime() - start.getTime()) / (24 * 60 * 60 * 1000) + 1; // 统计天数
for (int i = 0; i < records.size(); i++) {
AnalysisJudgmentVehicleVO record = records.get(i);
Date date = sdf.parse(record.getGcsj());
String day = sdf.format(date).substring(0, 10);
if (date.getTime() >= start.getTime() && date.getTime() <= end.getTime()) {
String key = record.getHpzl() + record.getHphm() + day;
if (!allCars.containsKey(day)) {
allCars.put(day, new HashSet<>());
}
allCars.get(day).add(key);
if (date.getHours() >= 6 && date.getHours() < 18) { // 白天
if (!dayCars.containsKey(day)) {
dayCars.put(day, new HashSet<>());
}
dayCars.get(day).add(key);
} else { // 晚上
if (!nightCars.containsKey(day)) {
nightCars.put(day, new HashSet<>());
}
nightCars.get(day).add(key);
}
}
}
for (String day : allCars.keySet()) {
Set cars = allCars.get(day);
int dayCount = 0;
int nightCarCount = 0;
int nightCountForDay = 0;
for (String car : cars) {
if (dayCars.containsKey(day) && dayCars.get(day).contains(car)) {
dayCount++;
}
if (nightCars.containsKey(day) && nightCars.get(day).contains(car)) {
nightCarCount++;
}
}
if (nightCars.containsKey(day)) {
nightCountForDay = nightCars.get(day).size() - nightCarCount;
}
nightCount.put(day, nightCountForDay);
totalCount.put(day, cars.size());
double ratio = (double) nightCountForDay / (totalCount.get(day) * dayDiff);
if (ratio > dayNightRatio) {
for (String car : nightCars.get(day)) {
if (!dayCars.containsKey(day) || !dayCars.get(day).contains(car)) {
AnalysisJudgmentVehicleVO record = records.get(0);
record.setGcsj(day + " " + record.getGcsj().substring(11));
result.add(record);
break;
}
}
}
}
} catch (ParseException e) {
e.printStackTrace();
}
return result;
}