2

我的意思是一个数组,其中包含以下单词:

@[@"Hellobla", @"Hello Kitty", @"Hello Kitty Bla", @"Bla apukitty", @"Bla helkitty"]

我需要对它们进行排序,就像锚定由空格分隔的所有单词一样@" "

如果我输入"Hel"- 我会看到@"Hellobla", @"Hello Kitty Bla", @"Bla helkitty"

如果我输入"kit"- 我会看到@"Hello Kitty Bla", @"Hello Kitty"

如果我输入"bla"- 我会看到@"Hello Kitty Bla", @"Bla apukitty", @"Bla helkitty"

ETC :)

我在块返回数组中执行此操作:

    // arrayWithData - All Words
    // searchWord - Text i try to search with
    // arrayToWrite - array to return with words
    // arrayToCompare - array with words already added whitch first NSPredicate *beginPredicate = [NSPredicate predicateWithFormat:@"self BEGINSWITH[cd] %@", //searchText];

beginMatch = [self.objects filteredArrayUsingPredicate:beginPredicate];

   sortedWithSecondWordArray = ^(NSArray * arrayWithData,
                                  NSString * searchWord,
                                  NSMutableArray *arrayToWrite,
                                  NSArray * arrayToCompare) {

        NSString *space = @" ";

        for (__strong NSString *string in arrayWithData) {
            NSString *staticString = string; 
            while ([string rangeOfString:space].location != NSNotFound) {
                NSRange range = NSMakeRange(0, [string rangeOfString:space].location);

                NSString *keyword = [[string stringByReplacingCharactersInRange:range withString:@""] trim];

                if (keyword.length > 0
                    && [keyword rangeOfString:searchWord options:NSAnchoredSearch].location != NSNotFound
                    && ![arrayToCompare containsObject:staticString]
                    && ![arrayToWrite containsObject:staticString]) {

                    [arrayToWrite addObject:staticString];
                }
                string = keyword;
            };
        }
        return arrayToWrite;
    };

它有效,但如果在我的 Array 2000 个字符串中,它可能超过 10k。它真的很糟糕。如何优化它?

4

2 回答 2

2

如果我正确理解了您的问题,那么您想匹配任何包含以您的搜索字符串开头的单词的字符串吗?

NSPredicate带有正则表达式的一个可以做到这一点,使用单词\b边界锚。

NSArray *data = @[@"Hellobla", @"Hello Kitty", @"Hello Kitty Bla", @"Bla apukitty", @"Bla helkitty"]; 

NSString *searchString = @"Hel"; // Change to other strings

NSString *anchoredPattern = [NSString stringWithFormat: @".*\\b%@.*", searchString];

NSPredicate *anchoredPred = [NSPredicate predicateWithFormat: @"SELF MATCHES[cd] %@", anchoredPattern];

NSArray *filtered = [data filteredArrayUsingPredicate:anchoredPred];

它会产生您想要的结果,但可能的例外是它在结果中同时包含“Hello Kitty”和“Hello Kitty Bla”。

如果这不是您想要的,您可能需要再次过滤结果以排除作为数组中其他字符串的子字符串的字符串。

于 2013-03-21T16:25:40.300 回答
0

你说你的搜索有效(它应该做什么在问题中不是很清楚),但你担心速度。它是否明显很慢,或者您预测会很慢?

字符串计数,而不是字节计数,是速度的因素。2000 有点大,但我的直觉是使用蛮力它会足够快。

或者,优化搜索是一个巨大的话题,但可以将大多数解决方案总结如下:建立索引。例如查看“尝试”

于 2013-03-21T16:30:01.490 回答