如何检查值是否在数组中存储的两个值之间

时间:2019-01-03 17:19:46

标签: arrays swift range

我一直在寻找类似的问题,但是我不知道正确的措词。我有一组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)。

2 个答案:

答案 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