JAVA 1.传入工作时间段字符串 格式为HH:mm-HH:mm;HH:mm-HH:mm;... 2.传入空闲时间段字符串 格式为HH:mm;HH:mm-HH:mm;HH:mm-HH:mm 3.判断 空闲时段的最后结束时间是否是工作时段段的最后下班时间 如果是 继续判断之前的空闲时段是否有连续空闲时段 如果有则返回这个空闲时段的开始时间 例如 工作时间段是08:00-10:00;13:00-15:00 空闲时间段是 09:10-10:00;13:00-15:00 那么应该返回09:10 因为 空闲时段中13:00和15:00是工作时段的最后上下班时间 10:00又是上一个下班时间 故9:10是连续空闲时段的开始时间
时间: 2024-01-26 07:03:38 浏览: 205
好的,我可以帮你解决这个问题。首先,我们需要将传入的工作时间段和空闲时间段字符串解析成时间段列表,然后对它们进行比较。
以下是一个可能的实现:
```java
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
public class TimeUtils {
public static LocalTime findFirstFreeTime(String workTimes, String freeTimes) {
List<TimeRange> workRanges = parseTimeRanges(workTimes);
List<TimeRange> freeRanges = parseTimeRanges(freeTimes);
LocalTime lastWorkEndTime = getLastWorkEndTime(workRanges);
for (TimeRange freeRange : freeRanges) {
if (freeRange.getEnd().equals(lastWorkEndTime)) {
LocalTime firstFreeTime = findFirstContinuousFreeTime(freeRanges, freeRange);
if (firstFreeTime != null) {
return firstFreeTime;
}
}
}
return null;
}
private static List<TimeRange> parseTimeRanges(String times) {
List<TimeRange> ranges = new ArrayList<>();
String[] rangeStrs = times.split(";");
for (String rangeStr : rangeStrs) {
String[] parts = rangeStr.split("-");
TimeRange range = new TimeRange(LocalTime.parse(parts[0]), LocalTime.parse(parts[1]));
ranges.add(range);
}
return ranges;
}
private static LocalTime getLastWorkEndTime(List<TimeRange> workRanges) {
TimeRange lastRange = workRanges.get(workRanges.size() - 1);
return lastRange.getEnd();
}
private static LocalTime findFirstContinuousFreeTime(List<TimeRange> freeRanges, TimeRange currentRange) {
int currentIndex = freeRanges.indexOf(currentRange);
for (int i = currentIndex - 1; i >= 0; i--) {
TimeRange prevRange = freeRanges.get(i);
if (prevRange.getEnd().equals(currentRange.getStart())) {
return prevRange.getStart();
} else if (!prevRange.getStart().isBefore(currentRange.getStart())) {
break;
}
currentRange = prevRange;
}
return null;
}
private static class TimeRange {
private final LocalTime start;
private final LocalTime end;
public TimeRange(LocalTime start, LocalTime end) {
this.start = start;
this.end = end;
}
public LocalTime getStart() {
return start;
}
public LocalTime getEnd() {
return end;
}
}
}
```
这里定义了一个`TimeRange`类来表示时间段,它包含一个开始时间和一个结束时间。`parseTimeRanges`方法将传入的时间段字符串解析成时间段列表,`getLastWorkEndTime`方法获取工作时间段的最后一个结束时间,`findFirstContinuousFreeTime`方法在空闲时间段列表中查找当前时间段之前的连续空闲时间段,并返回第一个连续空闲时间段的开始时间。最后,`findFirstFreeTime`方法将这些方法组合起来,实现整个逻辑。
你可以这样调用它:
```java
LocalTime firstFreeTime = TimeUtils.findFirstFreeTime(
"08:00-10:00;13:00-15:00",
"09:10-10:00;13:00-15:00"
);
System.out.println(firstFreeTime); // 输出09:10
```
注意,这个实现假设传入的时间段字符串是合法的,并且工作时间段和空闲时间段都是按照开始时间排序的。如果这些假设不成立,就需要对代码进行适当的修改。
阅读全文