Как проверить, находится ли значение между двумя значениями, хранящимися в массиве - PullRequest
0 голосов
/ 03 января 2019

Я искал вокруг, пытаясь найти похожую проблему, однако я не знаю правильную формулировку. У меня есть массив CGFloats, а затем отдельный сохраненный 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 находится в levelLevels между 4.4 и 5.533333333333334 и вернуть индекс (4 или 5).

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Способ работы 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
0 голосов
/ 03 января 2019

Это вернет более высокий индекс для следующего большего значения.Я предполагал из вашего примера, что массив уже отсортирован

let largerIndex  = pressureLevels.firstIndex(where: { $0 > tempPressure}) 
let smallerIndex = largerIndex - 1

Обратите внимание на крайние случаи, если нет значения больше tempPressure, тогда largerIndex будет nil, и если все значения вмассив больше, чем largerIndex будет 0

...