繁体   English   中英

在iOS中将匹配结果的数组排在第一位和不匹配的结果中

[英]Sort array with matched results in first and unmatched results as next in iOS

Input Array:  (
{
    title = "Antonik's BBQ";
},
{
    title = "Jigsaw Salon";
},
{
    title = "London Fish 'N Chips";
},
{
    title = "Kenneth of London";
},

{
    title = "Il Pastaio Fresh Pasta Company";
},
{
    title = "Everett & Jones Barbeque";
},
{
    title = "Duke of Edinburgh";
}
);

从上面的数组中,如果搜索文本为“ london”,则需要按如下方式对数组进行先生处理。

 Expected sorted array:   (
    {
        title = "Kenneth of London";
    },
    {
        title = "London Fish 'N Chips";
    },

    {
        title = "Antonik's BBQ";
    },
    {
        title = "Jigsaw Salon";
    },
    {
        title = "Il Pastaio Fresh Pasta Company";
    },
    {
        title = "Everett & Jones Barbeque";
    },
    {
        title = "Duke of Edinburgh";
    }
    );

我试过使用谓词如下。

NSPredicate *predicate=[NSPredicate predicateWithFormat:@"title CONTAINS[cd] %@", _yelpSearchBar.text];
inputArray=[inputArray filteredArrayUsingPredicate:predicate];

但是它返回包含“伦敦”的结果。 有人可以告诉我正确排序的方法。

谢谢。

我可以想象的唯一方法是手动完成。 已经过测试:

» cat arraysort.m
#import <Foundation/Foundation.h>

NSArray *specialSort(NSArray *array, NSString *searchString)
{
    NSMutableArray *matched = [NSMutableArray new];
    NSMutableArray *unmatched = [NSMutableArray new];
    for (NSString *str in array) {
        if ([str rangeOfString:searchString options:NSCaseInsensitiveSearch].location != NSNotFound)
            [matched addObject:str];
        else
            [unmatched addObject:str];
    }

    return
        [[matched sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] arrayByAddingObjectsFromArray:unmatched];
}

int main(int argc, const char **argv) {
    @autoreleasepool {
        NSArray *arr = @[@"Antonik's BBQ", @"Jigsaw Salon", @"London Fish 'N Chips", @"Kenneth of London", @"Il Pastaio Fresh Pasta Company", @"Everett & Jones Barbeque", @"Duke of Edinburgh"];
        NSArray *sorted = specialSort(arr, @"london");
        NSLog(@"%@", sorted);
    }

    return 0;
}

» ./arraysort
2014-08-08 09:23:41.506 arraysort[81545:507] (
    "Kenneth of London",
    "London Fish 'N Chips",
    "Antonik's BBQ",
    "Jigsaw Salon",
    "Il Pastaio Fresh Pasta Company",
    "Everett & Jones Barbeque",
    "Duke of Edinburgh"
)
 »

代码看起来不错。 我通过以下示例检查了您的程序:

NSArray *arr = @[@"Antonik's BBQ", @"Jigsaw Salon", @"London Fish 'N Chips", @"Kenneth of London", @"Il Pastaio Fresh Pasta Company", @"Everett & Jones Barbeque", @"Duke of Edinburgh"];
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"self CONTAINS[cd] %@", @"london"];
arr = [arr filteredArrayUsingPredicate:predicate];

我知道了

(lldb) po arr
<__NSArrayI 0x10d599a50>(
London Fish 'N Chips,
Kenneth of London
)

我所做的唯一区别是直接在数组中将title更改为self和字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM