【问题标题】:Finding a value in an array of arrays (similar to VLOOKUP function in Excel) in Swift在 Swift 中查找数组数组中的值(类似于 Excel 中的 VLOOKUP 函数)
【发布时间】:2019-03-17 06:05:28
【问题描述】:

我对 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(),但我不知道如何处理数组中的数组。任何帮助表示赞赏。

【问题讨论】:

  • 感谢您的帮助!

标签: ios arrays swift


【解决方案1】:

您可以按照以下方式进行。

获取数组的第一列:

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

【讨论】:

  • 你的答案比我的好:)
  • @NikolaiRuhe:我不会这么说。您的解决方案是直截了当的,并且避免了任何中间数组的创建。我认为值得保留。
  • OP 已经尝试使用 filter 并且您正在展示它是如何完成的。此外,您可以优雅地避免排序方面。这个级别的问题更多的是关于教学而不是提供参考。我认为我的回答只是分散了注意力。
【解决方案2】:

类似这样的:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 2020-09-03
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多