检查子串是否在数组中并吐出

时间:2012-06-20 14:01:44

标签: objective-c

我是一个Objective-C初学者,现在我想循环一个数组并检查子串是否在那里。如果为true,则应将数组的对象放入另一个将放在屏幕上的数组中。这是我的代码:

NSArray *origarray = [NSArray arrayWithObjects:
                 @"One",
                 @"Two",
                 @"Three",
                 @"Four",
                 @"Five",nil];
for(NSString *words in origarray){
    NSMutableArray *newarray = [[NSMutableArray alloc] init];
    NSRange range = [words rangeOfString:@"o"];
    if(range.location != NSNotFound){
        [newarray addObject:words];
    }
    textview.text = [newarray description];
}

在这种情况下,我们应该得到一个'One','Two'和'Four'的数组,因为它们都包含'o'。不幸的是我在textview中得到一个空数组。 (我知道'description'仅用于调试目的)。 是否有人可以告诉我该如何做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以使用NSPredicate来执行此操作,例如

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains %@", @"o"];
NSArray* newArray = [origarray filteredArrayUsingPredicate:predicate];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", @"o"];
NSArray* newArray = [origarray filteredArrayUsingPredicate:predicate];

用于不区分大小写的匹配

答案 1 :(得分:1)

获得空数组的原因是因为每次迭代时,都要重新分配数组。试试这个(注意我已经在循环之前放置了数​​组的分配,所以它已经完成了一次并且还更新了文本视图):

NSArray *origarray = [NSArray arrayWithObjects:
             @"One",
             @"Two",
             @"Three",
             @"Four",
             @"Five",nil];

NSMutableArray *newarray = [[NSMutableArray alloc] init];

for(NSString *words in origarray){
    NSRange range = [words rangeOfString:@"o"];
    if(range.location != NSNotFound){
        [newarray addObject:words];
    }
}

textview.text = [newarray description];

编辑:@Alladinian提出了一个很好的观点,即rangeOfString:执行区分大小写的搜索。如果您希望它不区分大小写,则必须更改:

NSRange range = [words rangeOfString:@"o"];

NSRange range = [words rangeOfString:@"o" options:NSCaseInsensitiveSearch];