2016-03-13 56 views
0

在Objective-C中有沒有類似於array_search的任何函數?我試圖讓一個應該工作,但邏輯是不正確的。找到浮點數組

-(BOOL)searchInArray :(NSMutableArray *)allData :(float)dataToFind { 
    BOOL *temp = false; 

    for(int i=0;i<=[allData count];i++){ 
     if([[allData objectAtIndex:i] floatValue] == dataToFind){ 
      return true; 
     } else { 
      return false; 
     } 
    } 
    return temp; 
} 

回答

0

試試這個:

- (BOOL)searchInArray:(NSArray<NSNumber *> *)array forFloat:(float)floatToFind 
{ 
    for (NSNumber *number in array) { 
     if (number.floatValue == floatToFind) { 
      return YES; 
     } 
    } 
    return NO; 
} 
+2

如果您添加了關於問題的解釋以及解決問題的方法,這將是更好的答案。 – rmaddy

+0

這將泛型添加到NSArray *數組參數規範中,因此如果您嘗試傳遞任何其他的NSArray,編譯器會吐出一個錯誤。 – geowar

2

你的實現是差不多吧。問題是,如果數組中的第一個元素與您正在搜索的float不匹配,則該方法將返回false而不查看數組的其餘部分。

如果有任何數組元素匹配,那麼您想要做的是返回true,並且只有在查看整個數組並且它們都不匹配時才返回false

- (BOOL)searchInArray:(NSMutableArray *)allData forFloat:(float)dataToFind { 
    for (int i = 0; i < [allData count]; i++) { 
     if ([[allData objectAtIndex:i] floatValue] == dataToFind) { 
      return true; 
     } 
    } 
    return false; 
} 

一個更現代的/可讀的版本可能是這樣的:

- (BOOL)array:(NSMutableArray *)array containsFloat:(float)theFloat { 
    for (NSObject *object in array) { 
     if ([object isKindOfClass:[NSNumber class]]) { 
      NSNumber *number = (NSNumber *)object; 
      if (number.floatValue == theFloat) { 
       return YES; 
      } 
     } 
    } 
    return NO; 
} 

這個版本已經從原來的幾個變化:

  • 它採用YESNO代替的truefalse;這是建議用於Objective C代碼。
  • 它使用for-each循環而不是按索引訪問數組;這更可讀。
  • 它試圖獲取floatValue之前檢查數組中的每個元素以確保它是一個數字;如果你的數組包含的東西不是數字,這將防止錯誤發生。
+1

這和它應該是'我<[所有數據計數]'而不是'我<= [所有數據計數]'。否則,你會得到一個超出界限的例外。快速枚舉也是更好的循環方式。 – Hamish

+1

而'i'應該是'NSInteger',而不是'int'。 「真」和「假」應該是「是」和「否」。 – rmaddy

+0

哎呀,我錯過了比較,謝謝@ originaluser2。我留下了索引和「真」/「虛假」的最小變化,但我現在添加了更現代的版本。 – DanielGibbs