【问题标题】:Efficiently find ranges of consecutive non-set bits in BitSet有效地在 BitSet 中找到连续未设置位的范围
【发布时间】: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));
}

【问题讨论】:

    标签: java calendar bitset


    【解决方案1】:

    有一种方法可以在给定索引处或之后获取下一个未设置位:BitSet.nextClearBit(int)

    有一个补充方法,nextSetBit(int),用于查找下一个设置位。

    所以,你可以用前者找到范围的开始,用后者找到范围的结束。

    你需要小心处理方法的返回值:

    • 如果 nextSetBit 返回 -1,则表示当前运行的清除位会延伸到 BitSet 的末尾。
    • nextClearBit 返回 -1,因为 BitSet 在清除位的数量方面没有明确定义的大小 - 它们本质上是无限扩展的,但实际上只是分配存储来保存 set位。因此,如果 nextClearBit 返回的值超出了 BitSet 的 逻辑 大小(即超出一天/日期范围结束的 15 分钟槽的索引),您知道您可以停止搜索。

    【讨论】:

    • 为了完整:还有previousClearBit(int)previousSetBit(int)从后往前搜索
    猜你喜欢
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2011-07-21
    • 2021-11-21
    • 2020-12-19
    • 1970-01-01
    相关资源
    最近更新 更多