2011-02-09 45 views
0

我在NSArray中有幾個自定義對象,我需要搜索所有對象並查找具有與字符串匹配的屬性的對象的索引。 我應該爲每個循環使用一個?每次在文本字段中輸入新字符時,我都需要相對快速地進行搜索。在NSArray中查找文本

回答

1

NSPredicate是整潔,但矯枉過正(它不會給你找到的對象的索引;只是對象本身)。

配對數組的方法,這將工作,我覺得很奇怪(可能是因爲它使用配對數組)。

我要麼使用一個for()環(和break;當我發現我一直在尋找的),或使用塊枚舉:

__block NSInteger indexOfMatchingObject = NSNotFound; 
[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([[obj property] doesWhatImLookingFor]) { 
    indexOfMatchingObject = idx; 
    *stop = YES; 
    } 
}]; 

還是略有不同的變體:

NSInteger indexOfMatchingObject = [myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) { 
    return ([[obj property] doesWhatImLookingFor]); 
}]; 

0

使用for循環,並在找到匹配項後記住break

1

循環顯然是一種方式,但謂詞的使用也可能適用。

- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate 
2

您可以在陣列緩存的屬性值:

NSArray *propertyValues = [myObjects valueForKey:@"someProperty"]; 

然後你就可以快速查找其someProperty等於值您正在搜索的對象的索引:

NSUInteger objectIndex = [propertyValues indexOfObject:propertyValue]; 

或者,您可以使用NSPredicate進行搜索(應該明顯更慢)或使用for循環(應該慢一點)。

如果您可以通過屬性值對對象進行排序,則可以優化for循環以查找平均2次未找到該值的情況。

+0

您認爲`for`循環會比`valueForKey:`方法慢嗎?與你的,你必須建立一個數組的每個對象的屬性,然後調用`indexOfObject:`就可以了。這是最差的O(2N)方法。用`for`循環,你只需要迭代一次數組。換句話說,for循環的速度應該是你提出的速度的兩倍(如果數組很小,差別可能可以忽略不計)。 – 2011-02-10 01:03:25

+0

@Dave DeLong我希望`valueForKey:`的結果可以提前緩存,所以你可以使用'indexOfObject:'可能有的任何優化。但我承認我甚至沒有嘗試檢查實際性能。 – Costique 2011-02-10 05:50:01

0

我會使用謂詞來過濾數組,或者你可以枚舉,然後檢查對象。我將這個類別添加到NSArray in my framework中,以便我可以檢查塊中的每個對象,並在找到我想要的內容時將其返回。

-(id)cw_findWithBlock:(BOOL (^)(id obj))block 
{ 
    for(id obj in self){ 
     if(block(obj)){ 
      return obj; 
     } 
    } 

    return nil; 
} 

你可以很容易地做同樣的事情,但返回索引。