【发布时间】:2022-02-04 19:24:34
【问题描述】:
我正在尝试使用 BitSet 表示特定日期的日历可用/不可用插槽,每个位代表 15 分钟。设置的位代表被阻止的日历事件。为了获得空闲的插槽,我需要找到未设置位的范围。
我有以下 BitSet
00000000000000000011111001000000000011100000000000000000011000
如何有效地找到未设置的位范围。在这种情况下 (1,18) 和 (24,25) 和 (27,36) 等。
下面是我目前写的代码,感觉效率不高,也不干净。
int startIndex = -1;
int nextIndex = -1;
for(int i = getSlotIndex(currentWorkingStartDate); i <= getSlotIndex(currentWorkingEndDate); i++) {
if(!matrix.get(i)) {
if(startIndex == -1) {
startIndex = i;
nextIndex = i;
}else {
nextIndex = i;
}
}else if(startIndex != -1){
ZonedDateTime availableStartDate = day.plusHours((startIndex/4)).plusMinutes(startIndex%4 * 15);
ZonedDateTime availableEndDate = availableStartDate.plusMinutes((nextIndex - startIndex + 1) * 15L);
currAvailabilitySlots.addAll(
getSlotsBasedOnDurationWithTimeZone(new SlotModel(availableStartDate,availableEndDate),durationOfSlot,candidateTimeZoneId));
startIndex = -1;
nextIndex = -1;
}
}
if(startIndex != -1) {
ZonedDateTime availableStartDate = day.plusHours((startIndex/4)).plusMinutes(startIndex%4 * 15);
ZonedDateTime availableEndDate = availableStartDate.plusMinutes((nextIndex - startIndex) * 15L);
currAvailabilitySlots.addAll(
getSlotsBasedOnDurationWithTimeZone(new SlotModel(availableStartDate,availableEndDate),durationOfSlot,candidateTimeZoneId));
}
【问题讨论】: