我一直在寻找类似的问题,但是我不知道正确的措词。我有一组CGFloat,然后有一个单独保存的CGFloat。我想检查单个CGFloat是否在数组存储的值之间。
我目前在循环中从数组的末尾开始检查它,并检查它是否小于该值。然后,它从右移到左,直到不小于它并返回索引。有内置的方法或更干净的方法来做到这一点吗?
例如:
var pressureLevels:[CGFloat] = [0, 1.0, 2.133333333333333, 3.266666666666667, 4.4, 5.533333333333334, 6.666666666666667]
var tempPressure: CGFloat = 4.877777
返回4或返回5
我想知道tempPressure的压力处于4.4到5.533333333333334之间,并返回索引(4或5)。
答案 0 :(得分:1)
这将为下一个更大的值返回较高的索引。我从您的示例中假设该数组已经排序
let largerIndex = pressureLevels.firstIndex(where: { $0 > tempPressure})
let smallerIndex = largerIndex - 1
请注意边缘情况,如果不存在大于tempPressure
的值,则largerIndex
将为nil
,如果数组中的所有值都较大,则largerIndex
将为0
答案 1 :(得分:0)
Joakim Danielson的方法适用于排序数组。如果数组未排序,则可以将逻辑放在Array类的扩展中,如下所示:
extension Array where Element == CGFloat {
func huggingIndexes(for value:CGFloat) -> (lower:Int?, upper:Int?) {
var largestLowerBound:CGFloat?
var lowerIndex:Int?
var smallestUpperBound:CGFloat?
var upperIndex:Int?
for (index, val) in self.enumerated() {
if val < value, val >= largestLowerBound ?? val {
largestLowerBound = val
lowerIndex = index
} else if val > value, val <= smallestUpperBound ?? val {
smallestUpperBound = val
upperIndex = index
}
}
return (lowerIndex, upperIndex)
}
}
var pressureLevels:[CGFloat] = [2.133333333333333, 4.4, 6.666666666666667, 1.0, 5.533333333333334, 0.0, 3.266666666666667]
var tempPressure: CGFloat = 4.877777
let huggingIndexes = pressureLevels.huggingIndexes(for: tempPressure)
print(huggingIndexes.lower) //Prints 1
print(huggingIndexes.upper) //Prints 4