2012-07-11 74 views
14

在PHP这是一个代码行:从NSArray中移除空NSStrings的最简单方法是什么?

$array_without_empty_strs = array_filter($array_with_empty_strs); 

什么是客观等价的C?

更新 - 增加了以下的测试代码来说明使用的尼古拉汝河的解决方案:

// SOLUTION Test Code 
NSMutableArray *myArray = [[NSMutableArray alloc] init ]; 
[myArray addObject:[NSNumber numberWithInt:5]]; 
[myArray addObject:@""]; 
[myArray addObject:@"test"]; 
NSLog(@"%@", myArray); 
[myArray removeObject:@""]; 
NSLog(@"%@", myArray); 

// SOLUTION Test Code Output 
2012-07-12 08:18:16.271 Calculator[1527:f803] (
    5, 
    "", 
    test 
) 
2012-07-12 08:18:16.273 Calculator[1527:f803] (
    5, 
    test 
) 

回答

58

它更简单:

[mutableArrayOfStrings removeObject:@""]; 

如果阵列不可改变你之前创建一个mutableCopy

removeObject:删除全部返回YES的数组中的对象isEqual:

1

this question,这几乎是完全一样的你。

我使用非字符串(对象)的情况下,这种方法在哪里数组NSMutableArray

- (void) clearArrayOut 
{ 

    for (int j=[array count]-1; j>=0; j--) 
     if ([[array objectAtIndex:j] length] == 0) 
      [array removeObjectAtIndex:j]; 
} 

而且这完全是我偷来的抢mayoff美丽的答案对不NSPredicate

工作我的问题NSPredicate instead of loop to filter an array of objects

+0

这是不灵活了!事实上,解决这个问题确实是一个非常糟糕的方法,不仅表现明智。看看rob mayoff的答案,看看它是如何灵活的。 – JustSid 2012-07-11 18:44:48

+0

@DustinRowland您给出的链接与您的链接完全不同!另外,如果你在自己的代码中使用类似的东西,你应该让自己熟悉谓词,谓词CAN调用方法,自定义对象不是这种代码的借口! – JustSid 2012-07-11 18:49:45

+0

@DustinRowland此外,如果您递减'j'而不是再次启动循环,则代码会更快。 – JustSid 2012-07-11 18:50:27

20
NSArray *noEmptyStrings = [maybeEmptyStrings filteredArrayUsingPredicate: 
    [NSPredicate predicateWithFormat:@"length > 0"]]; 
1

这是另一种更灵活的方法,即使使用predica TE。

NSArray* filteredArray = [arrayToFilter objectsWithIndexes: 
           [arrayToFilter indexesOfObjectsPassingTest: 
           ^((id obj, NSUInteger idx, BOOL *stop) 
           { 
            return [obj length] > 0; 
           }]]; 
3

我们可以使用NSPredicate 这里我的代码

NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(id str, NSDictionary *unused) { 
      return ![str isEqualToString:@""]; 
     }]; 

     NSArray *filtered = [yourArray filteredArrayUsingPredicate:pred]; 
相关问题