如何用简洁方式获取环形缓冲区数组的前序索引?
环形缓冲区中获取前序索引的简洁实现
我们有一个数组:
array = [1, 3, 5, 78]
将其当作环形缓冲区(末尾元素与首元素相连)使用时,获取任意元素的下一个索引有很简洁的写法:
element = 3 index = array.findIndex(e => e == 3) nextIndex = (index + 1) % array.length // 核心代码
这行代码能完美适配三种场景:
- 未找到元素(
index == -1) - 元素是最后一个索引(
index == 3) - 找到元素且非最后一个索引
但要获取前序索引(previousIndex)时,好像得针对以下三种场景分别写逻辑:
- 未找到元素
- 元素是第一个元素
- 找到元素且非第一个元素
有没有简洁直观的一行代码能直接搞定前序索引?
当然有,核心思路是先加上数组长度再取余,避免负数运算带来的问题:
previousIndex = (index - 1 + array.length) % array.length
我们验证三种场景:
- 未找到元素(index = -1):
(-1 -1 + 4) %4 = 2%4 =2,和nextIndex逻辑一致,返回合法索引(虽未找到元素时结果无实际意义,但保持了逻辑统一性) - 元素是第一个索引(index=0):
(0-1+4)%4=3%4=3,正确返回最后一个元素的索引 - 找到元素且非第一个索引(比如index=1):
(1-1+4)%4=0%4=0,正确返回前一个元素的索引
这样一行代码就覆盖了所有场景,和获取下一个索引的写法保持了同样的简洁性。
内容的提问来源于stack exchange,提问作者fguillen
相关产品推荐
相关产品推荐

