2011-02-15 60 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];