2017-04-02 45 views
0

我有一個搜索格式爲[(Double,Double)]的元組的函數。它找到給定的x值,如果找到,則返回相應的y值。如何在數組中使用限制位數來搜索數組?

我需要改變它,以便不是在(x,y)對列表中搜索確切的x值,而是隻搜索給定搜索項的小數點後的相同位數。

實施例:

var a: [(Double, Double)] = [(0.0,0.0)] 

a = [(0.1234, 0.0), (0.12345, 1.0), (0.123456, 2.0), (0.1234567, 3.0)] 

//the current version of the function, this is what I need to change 
func getValueFromTuples(tupleArr:[(Double,Double)],n:Double)->Double?{ 

    for tuple in tupleArr{ 

     if tuple.0 == n{ 

      return tuple.1 

     } 
    } 

    return nil 

} 

print("Value:", getValueFromTuples(tupleArr: a, n: 0.1234)!) 
//needs to return 0.0 

print("Value:", getValueFromTuples(tupleArr: a, n: 0.12345)!) 
//needs to return 1.0 

print("Value:", getValueFromTuples(tupleArr: a, n: 0.123456)!) 
//needs to return 2.0 
+0

您對發佈的代碼有什麼問題? – rmaddy

+0

問題是,如果我搜索值「0.12」,則不返回任何內容。這是因爲'0.12'不在數組中。所以我需要函數將數組中的x值截斷爲與輸入項相同的小數位數。所以每個x值將被截斷爲0.12,然後我只需要返回匹配的第一個y值。 – loltospoon

+0

不相關,但你爲什麼不使用像CGCON這樣更方便的類型? – vadian

回答

1

一種可能的解決方案是每個數字轉換爲一個字符串,看看「X」與字符串「n」個字符串開始。

func getValueFromTuples(tupleArr: [(Double,Double)], n: Double) -> Double? { 
    let nStr = "\(n)" 
    for tuple in tupleArr { 
     let xStr = "\(tuple.0)" 
     if xStr.hasPrefix(nStr) { 
      return tuple.1 
     } 
    } 

    return nil 
} 

請注意,這隻有在你的元組數組的「x」值排序正確時纔有效。

+0

這是否會繼續搜索其他匹配值的數組的其餘部分?一旦找到一個匹配的值,我就需要停下來。 – loltospoon

+0

爲什麼它會繼續?當找到匹配時,它有一個「返回」。嘗試一下。走着瞧吧。 – rmaddy

+0

我認爲這可能是因爲它循環遍歷tupleArr中的每個值,因此在找到第一個匹配之後,它將轉到'tupleArr'中的下一個值,並執行相同的操作,不是嗎?這裏新增了Swift。 – loltospoon