我对Swift 3和一般的编程语言都很陌生。我在一个数组和一个变量income中有以下数组:
let testArray: [[Double]] = [
[0,0],
[1000,20.5],
[3000,21],
[4000,22.5],
]
var income: Double = 3500我想要做的是类似于Excel中的VLOOKUP函数:我想在数组的第一列(即0,1000,3000,4000)中找到一个等于或立即小于我的变量的数字。在本例中,当income = 3500时,程序应该返回3000。我尝试使用filter(),但我不知道如何处理数组中的数组。感谢您的帮助。
发布于 2016-11-20 18:22:58
您可以按照以下步骤进行操作。
获取数组的第一列:
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一种可能的优化是将map和filter组合到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发布于 2016-11-20 17:47:38
如下所示:
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)https://stackoverflow.com/questions/40702404
复制相似问题