繁体   English   中英

在Swift中查找数组数组中的值(类似于Excel中的VLOOKUP函数)

[英]Finding a value in an array of arrays (similar to VLOOKUP function in Excel) in Swift

我对Swift 3和一般的编程语言还是陌生的。 我在数组和可变收入内有以下数组:

let testArray: [[Double]] = [
    [0,0],
    [1000,20.5],
    [3000,21],
    [4000,22.5],
   ]

var income: Double = 3500

我想做的事情类似于Excel中的VLOOKUP函数:我想在数组的第一列(即0、1000、3000、4000)中找到一个等于或立即小于我的变量的数字。 在这种情况下,当收入= 3500时,程序应返回3000。我尝试使用filter(),但是我不知道如何处理数组中的数组。 任何帮助表示赞赏。

您可以按如下进行操作。

获取数组的第一列:

let firstColumn = testArray.map { $0[0] }
print(firstColumn) // [0.0, 1000.0, 3000.0, 4000.0]

限制为小于或等于给定数量的那些元素:

let filtered = firstColumn.filter { $0 <= income }
print(filtered) // [0.0, 1000.0, 3000.0]

获取过滤后的数组的最大元素。 如果元素按升序排序,则可以使用last而不是max()

let result = filtered.max()!
// Or: let result = filtered.last!
print(result) // 3000.0

放在一起:

let result = testArray.map { $0[0] }.filter { $0 <= income }.max()!
print(result) // 3000.0

一个可能的优化是将mapfilter组合成flatMap

let result = testArray.flatMap { $0[0] <= income ? $0[0] : nil }.max()!
print(result) // 3000.0

此代码假定至少有一个匹配元素,否则为last! max()! 会崩溃。 如果不能保证:

if let result = testArray.flatMap( { $0[0] <= income ? $0[0] : nil }).max() {
    print(result) // 3000.0
} else {
    print("no result")
}

或提供默认值(在此示例中为0.0 ):

let result = testArray.flatMap( { $0[0] <= income ? $0[0] : nil }).max() ?? 0.0
print(result) // 3000.0

像这样:

let testArray: [[Double]] = [
        [0,0],
        [1000,20.5],
        [3000,21],
        [3500,22.5],
        [3300,21],
]

let income: Double = 3500

var closest = testArray[0][0]
var closestDif = closest - income

for innerArray in testArray {
    let value = innerArray[0]

    let thisDif = value - income

    guard thisDif <= 0 else {
        continue
    }

    if closestDif < thisDif {
        closestDif = thisDif
        closest = value

        guard closestDif != 0 else {
            break
        }
    }
}

print(closest)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM