2011-02-15 65 views
1

如何通過搜索模式匹配對NSArray進行排序? 所以,如果,比如我有一個搜索模式等於「XD」和值的數組:按匹配事件排序NSStrings的NSArray

axd 
bxd 
xdd 
gtxd 
xdc 

我怎麼能得到的輸出象下面這樣:

xdc 
xdd 
axd 
bxd 
gtxd 

預先感謝您。

回答

3

使用NSArraysortedArrayUsingFunction:與函數的訂單首先由檢索詞的位置,然後通過字符串的自然順序。

NSInteger sorter(id arg1, id arg2, void *context) 
{ 
    NSString *searchTerm = (NSString *)context; 

    NSRange range1 = [arg1 rangeOfString:searchTerm]; 
    NSRange range2 = [arg2 rangeOfString:searchTerm]; 

    if (range1.location < range2.location) 
     return NSOrderedAscending; 
    if (range1.location > range2.location) 
     return NSOrderedDescending; 

    return [arg1 compare:arg2]; 
} 

NSArray *array = [NSArray arrayWithObjects:@"axd", @"bxd", @"xdd", @"gtxd", @"xdc", nil]; 
NSArray *sortedArray = [array sortedArrayUsingFunction:sorter context:@"xd"]; 

此打印:

2011-02-15 01:33:49.642 GreatApp[78849:a0f] (
    xdc, 
    xdd, 
    axd, 
    bxd, 
    gtxd 
) 
+0

謝謝,我選擇你的解決方案與不區分大小寫的搜索略有變化。 – user478681 2011-02-15 09:50:09

1

您可以使用NSArray的sortedArrayUsingFunction:context:方法:

NSInteger occurenceSort(NSString* s1, NSString* s2, void *context) 
{ 
    NSRange range1 = [s1 rangeOfString:(NSString*)context]; 
    NSRange range2 = [s2 rangeOfString:(NSString*)context]; 

    if (range1.location < range2.location) 
     return NSOrderedAscending; 
    else if (range1.location > range2.location) 
     return NSOrderedDescending; 

    return NSOrderedSame; 
} 

... 
NSString *stringToSearch = @"xd"; 
NSArray *sorterArray = [yourArray sortedArrayUsingFunction:occurenceSort context:stringToSearch];