簡體   English   中英

NSMutableArray和NSPredicate過濾

[英]NSMutableArray and NSPredicate filtering

我試圖用一個對象中的兩個實體來過濾我的數組,就像我有一個Person對象,其中我有名字,地址,數字,電子郵件等。我試圖用名稱和數字過濾我的數組對象列表。 如何使用NSPredicate實現這一目標?

創建謂詞(以下假設您的Person類具有namenumber字符串屬性):

NSString *nameFilter = @"Steve*";
NSString *numberFilter = @"555-*";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name like %@) or (number like %@)", nameFilter, numberFilter];

然后,過濾數組(假設您有一個Person對象的NSArray ):

NSArray *personArray = /* obtain from somewhere */;
NSArray *filtered = [personArray filteredArrayUsingPredicate:pred];

結果將是一個包含Person對象的數組,其name可以是“Steve”,“Steven”等,其編號以555-

編輯

你所說的並沒有多大意義。 您無法從類中刪除屬性(或者更確切地說,您不應該刪除)。 如果您只想要一個只包含名稱和數字的數組,則必須遍歷Person對象數組:

NSMutableArray *result = [NSMutableArray array];

for (Person *p in personArray)
    [result addObject:[NSString stringWithFormat:"%@ : %@", [p name], [p number]]];

我相信你在尋找:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name==%@",name];

或者如果你想要字符串名稱的相似之處,你也可以使用:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name like %@",name];

假設電話號碼只是一個int,您可以使用==,<,<=等進行數字比較

然后應用它:

NSArray * filteredarray  = [array filteredArrayUsingPredicate:predicate];

我更喜歡使用CONTAINS字來進行過濾。 這項工作很容易。 或者你可以將它們組合在一起:

NSPredicate * predicate =
 [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR name LIKE[cd] %@", filterName, filterName];

你可以參考官方DOC

BEGINSWITH:左手表達式以右手表達式開頭。

CONTAINS:左手表達式包含右手表達式。

ENDSWITH:左手表達式以右手表達式結束。

LIKE:左手表達式等於右手表達式:? 和*被允許作為通配符,在哪里? 匹配1個字符,*匹配0個或更多個字符。

匹配:根據ICU v3,左手表達式使用正則表達式比較等於右手表達式(有關詳細信息,請參閱ICU用戶指南中的正則表達式)。

NSPredicate *pNewsCard = [NSPredicate predicateWithFormat:@"feedType = %@", @"NewsCard"];

NSArray *filteredNewsCard = [arrayTotalFeed filteredArrayUsingPredicate:pNewsCard];

feedType是要比較的Custom對象的屬性, arrayTotalFeed是Custom對象的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM