【问题标题】:What's the easiest way to remove empty NSStrings from an NSArray?从 NSArray 中删除空 NSStrings 的最简单方法是什么?
【发布时间】:2012-07-11 10:57:06
【问题描述】:

在 PHP 中是一行代码:

$array_without_empty_strs = array_filter($array_with_empty_strs);

目标 C 等价物是什么?

UPDATE - 添加如下测试代码来说明 Nikolai Ruhe 方案的使用:

// 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
)

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      更简单:

      [mutableArrayOfStrings removeObject:@""];
      

      如果您的数组不可变,您必须先创建一个mutableCopy

      removeObject:isEqual: 返回 YES 的数组中删除 所有 个对象。

      【讨论】:

        【解决方案3】:

        这是一种替代方法,它甚至比使用谓词更灵活。

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

        【讨论】:

          【解决方案4】:

          this question,它和你的几乎一模一样。

          我将此方法用于不适用于NSPredicate的非字符串(对象)情况

          数组是NSMutableArray

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

          我完全只是从 rob mayoff 对我的问题 NSPredicate instead of loop to filter an array of objects 的漂亮回答中偷走了这个

          【讨论】:

          • 这根本不灵活!事实上,它是解决这个问题的一种非常糟糕的方法,不仅仅是性能方面的。看看 rob mayoff 的回答,看看它是如何灵活地完成的。
          • @DustinRowland 您提供的链接显示的答案与您的完全不同!另外,如果你在自己的代码中使用这样的东西,你应该熟悉谓词,谓词可以调用方法,自定义对象不是这种代码的借口!
          • @DustinRowland 此外,如果您减少 j 而不是重新开始循环,您的代码会更快。
          • @JustSid 我刚刚从一个 Java 项目中改编了这个,如果你减少循环计数器,Java 就会发牢骚。
          • @RaymondWang 哎呀!你是对的......一个在平局上快速的例子。我将删除 cmets。
          【解决方案5】:
          NSArray *noEmptyStrings = [maybeEmptyStrings filteredArrayUsingPredicate:
              [NSPredicate predicateWithFormat:@"length > 0"]];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-12-25
            • 1970-01-01
            • 2016-12-03
            • 1970-01-01
            • 2016-08-31
            • 1970-01-01
            • 1970-01-01
            • 2011-11-12
            相关资源
            最近更新 更多