说我有5个Ints的数组。如果索引递增或递减(例如)以下情况,包装数组索引的最有效方法是什么?
其中n = 0:arr[n-1]
// - > arr[4]
(从0回到数组的末尾)
其中n = 2:arr[n+1]
// - > arr[3]
(表现正常)
其中n = 4:arr[n+1]
// - > arr[0]
(从数组末尾包装为0)
答案 0 :(得分:2)
您可以使用mod操作来获取计数的-count范围,然后重新计算并重新计数:
let foo = [0, 1, 2, 3, 4, 5]
for i in -6...7 {
print(i, foo[(i % foo.count + foo.count) % foo.count])
}
// -6 0
// -5 1
// -4 2
// -3 3
// -2 4
// -1 5
// 0 0
// 1 1
// 2 2
// 3 3
// 4 4
// 5 5
// 6 0
这适用于两个方向。
答案 1 :(得分:0)
晚了一点,但是如果您遇到相同的问题,并且有很多环绕数组索引的用例,则也可以将接受的答案中的%
解决方案放入Array的简单下标扩展,例如:
extension Array {
subscript (wrapping index: Int) -> Element {
return self[(index % self.count + self.count) % self.count]
}
}
示例用法:
let array = ["a","b","c"]
print( array[wrapping: 0] ) // a
print( array[wrapping: 4] ) // b
print( array[wrapping: -1] ) // c