2016-11-20 14 views
0

我對Swift 3和一般的編程語言都很陌生。我有一個數組和可變收入裏面以下陣列:在Swift中查找數組數組中的值(類似於Excel中的VLOOKUP函數)

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

var income: Double = 3500 

我想要做的就是類似VLOOKUP函數在Excel中的東西:我想在數組的首列查找(即0, 1000,3000,4000)是一個等於或小於我的變量的數字。在這種情況下,因爲收入= 3500,程序應該返回3000.我嘗試使用filter(),但我不知道如何處理數組中的數組。任何幫助讚賞。

+0

感謝您的幫助! – fbelfort

回答

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) 
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 

This c ode假定至少有一個匹配元素,否則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 
+0

你的回答只比我的好:) –

+0

@NikolaiRuhe:我不會這麼說。您的解決方案非常簡單,避免創建任何中間陣列。我認爲值得保留。 –

+1

OP已經嘗試使用'filter',並且您正在展示如何完成。此外,您可以優雅地避免排序方面的問題。這個級別的問題更多的是關於教學而不是提供參考。我想我的答案只是分散注意力。 –