【问题标题】:sorting NSArray of NSStrings by match occurrence按匹配出现排序 NSStrings 的 NSArray
【发布时间】:2011-02-15 09:20:57
【问题描述】:

如何通过搜索模式匹配对 NSArray 进行排序? 因此,例如,如果我有一个等于“xd”的搜索模式和一个值数组:

axd
bxd
xdd
gtxd
xdc

我怎样才能得到如下输出:

xdc 
xdd 
axd 
bxd 
gtxd

提前谢谢你。

【问题讨论】:

    标签: cocoa search sorting nsstring nsarray


    【解决方案1】:

    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
    )
    

    【讨论】:

    • 谢谢,我选择了您的解决方案,对不区分大小写的搜索稍作更改。
    【解决方案2】:

    你可以使用 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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 2014-02-15
      • 1970-01-01
      相关资源
      最近更新 更多