我在NSArray中有幾個自定義對象,我需要搜索所有對象並查找具有與字符串匹配的屬性的對象的索引。 我應該爲每個循環使用一個?每次在文本字段中輸入新字符時,我都需要相對快速地進行搜索。在NSArray中查找文本
0
A
回答
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
我會使用謂詞來過濾數組,或者你可以枚舉,然後檢查對象。我將這個類別添加到NSArray in my framework中,以便我可以檢查塊中的每個對象,並在找到我想要的內容時將其返回。
-(id)cw_findWithBlock:(BOOL (^)(id obj))block
{
for(id obj in self){
if(block(obj)){
return obj;
}
}
return nil;
}
你可以很容易地做同樣的事情,但返回索引。
相關問題
- 1. 查找重複的指數在NSArray中
- 2. 如何在NSArray中查找字符串?
- 3. 在gtk.TextView中查找文本
- 4. 在文本中查找「'」Postgres
- 5. 在Jar中查找文本文件
- 6. 在文檔中查找文本
- 7. JavaScript在文本文件中查找
- 8. 查找文本
- 9. 查找文本
- 10. 查找文本
- 11. 查找文本
- 12. 查找文本
- 13. 查找文本並在JavaScript
- 14. Python中查找文本
- 15. 在文本中查找特定參數
- 16. 在圖像中查找文本
- 17. 在大型文本中查找名稱
- 18. 在excel中查找並替換文本
- 19. 查找文本駝峯在Ruby中
- 20. Excel在文本中查找關鍵字
- 21. 在WebPage中查找/替換文本Asp.Net
- 22. 在Javascript中查找文本寬度
- 23. 在jQuery中查找文本寬度
- 24. 在python中查找並替換文本
- 25. 在textarea中查找並選擇文本
- 26. xpath在表格中查找文本
- 27. 在VBA中查找並添加文本
- 28. 如何在NSTextView中查找文本?
- 29. 在字符串中查找文本
- 30. 在文本中查找以下模式
您認爲`for`循環會比`valueForKey:`方法慢嗎?與你的,你必須建立一個數組的每個對象的屬性,然後調用`indexOfObject:`就可以了。這是最差的O(2N)方法。用`for`循環,你只需要迭代一次數組。換句話說,for循環的速度應該是你提出的速度的兩倍(如果數組很小,差別可能可以忽略不計)。 – 2011-02-10 01:03:25
@Dave DeLong我希望`valueForKey:`的結果可以提前緩存,所以你可以使用'indexOfObject:'可能有的任何優化。但我承認我甚至沒有嘗試檢查實際性能。 – Costique 2011-02-10 05:50:01