Swift:检查NSArray中哪个值最接近另一个给定值

时间:2015-03-05 01:12:34

标签: swift integer nsarray cgfloat

假设我有一个数组

var values:[CGFloat] = [-12.0, 450, 300]

我需要找出哪些数字最接近给定值,比如说

var givenValue:CGFloat = 64

有没有一种有效的方法可以找出数组中哪个对象最接近64?
我知道你可以这样做:

if abs(values[0] - 64) < abs(values[1] - 64) && abs(values[0] - 64) < abs(values[2] - 64) {
    println("values[0] is the closest to 64)
}

但是这会产生几个if语句并且看起来效率低下。

有谁知道更好的方法吗?在这个例子中,我需要数组中的值以及数组中的objectIndex。

3 个答案:

答案 0 :(得分:1)

minimumDifference保存为变量。

然后迭代数组。每次比较数组中值与最小差值的差异。

如果新差异较小,则换出最小差异。

在数组的末尾,您将获得最小的差异。

这与找到最高值,最小值等相同......

答案 1 :(得分:1)

为了完成起见,我将发布解决此问题的最终代码

    //Array to hold dist. of visible cell to pt. 64
    var distancesToTop = [CGFloat]()

    //Array of visible cell indexPaths
    var indexPaths = tableView.indexPathsForVisibleRows()!

    for visibleCell in tableView.visibleCells() { //for each visible cell...

        //Append distance to 64 to the array
        distancesToTop.append(abs((visibleCell.frame.minY - tableView.contentOffset.y) - 64))

    }

    //Find the lowest of those values
    let numMin = distancesToTop.reduce(CGFloat.max, { min($0, $1) })

    //Determine the objectForIndexPath that the minimum number was in
    let num = find(distancesToTop, numMin)!

答案 2 :(得分:1)

Swift 4.2 中,可以使用数组first(where:)last(where:)方法来实现:

    func findClosest(_ values: [CGFloat], _ givenValue: CGFloat) -> CGFloat {

        let sorted = values.sorted()

        let over = sorted.first(where: { $0 >= givenValue })!
        let under = sorted.last(where: { $0 <= givenValue })!

        let diffOver = over - givenValue
        let diffUnder = givenValue - under

        return (diffOver < diffUnder) ? over : under
    }

    let values:[CGFloat] = [-12.0, 450, 300]

    print(findClosest(values, 64.0))   // -12.0
    print(findClosest(values, 143.0))  // -12.0
    print(findClosest(values, 144.5))  // 300