首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中查找数组中的值(类似于Excel中的VLOOKUP函数)

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

Stack Overflow用户
提问于 2016-11-20 17:17:07
回答 2查看 557关注 0票数 0

我对Swift 3和一般的编程语言都很陌生。我在一个数组和一个变量income中有以下数组:

代码语言:javascript
复制
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(),但我不知道如何处理数组中的数组。感谢您的帮助。

EN

回答 2

Stack Overflow用户

发布于 2016-11-20 18:22:58

您可以按照以下步骤进行操作。

获取数组的第一列:

代码语言:javascript
复制
let firstColumn = testArray.map { $0[0] }
print(firstColumn) // [0.0, 1000.0, 3000.0, 4000.0]

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

代码语言:javascript
复制
let filtered = firstColumn.filter { $0 <= income }
print(filtered) // [0.0, 1000.0, 3000.0]

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

代码语言:javascript
复制
let result = filtered.max()!
// Or: let result = filtered.last!
print(result) // 3000.0

把所有这些放在一起:

代码语言:javascript
复制
let result = testArray.map { $0[0] }.filter { $0 <= income }.max()!
print(result) // 3000.0

一种可能的优化是将mapfilter组合到flatMap

代码语言:javascript
复制
let result = testArray.flatMap { $0[0] <= income ? $0[0] : nil }.max()!
print(result) // 3000.0

这段代码假设至少有一个匹配的元素,否则last!max()!将崩溃。如果不能保证:

代码语言:javascript
复制
if let result = testArray.flatMap( { $0[0] <= income ? $0[0] : nil }).max() {
    print(result) // 3000.0
} else {
    print("no result")
}

或提供默认值(本例中为0.0):

代码语言:javascript
复制
let result = testArray.flatMap( { $0[0] <= income ? $0[0] : nil }).max() ?? 0.0
print(result) // 3000.0
票数 2
EN

Stack Overflow用户

发布于 2016-11-20 17:47:38

如下所示:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40702404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档