【问题标题】:how to check empty array in Objective-C如何在 Objective-C 中检查空数组
【发布时间】:2015-11-02 05:58:09
【问题描述】:

我有一个数组。在该数组中,我想检查数组是否为空,然后将其删除。我正在尝试检查数组是否为零或计数为 0 但不起作用。

这是我的数组:

data(
(
abc,
xyz
),
(
yui,
hsjd
),
(
),
)

在数据数组中,最后一个数组为空,我想从数据数组中删除。请建议我任何想法。

【问题讨论】:

  • 你有一个数组,它的各个元素也是一个数组吗?你使用的是objective-c还是swift?
  • stackoverflow.com/questions/13889285/… 试试这个方法可以解决你的问题。
  • 我正在使用objective-c。
  • 你从哪里得到的?似乎它没有表示为数组内的数组
  • 用相关代码更新您的问题。

标签: objective-c nsmutablearray


【解决方案1】:

注意: 不要因为某个问题已经被否决而投反对票,所以这是一场公平的游戏,请先尝试阅读包含稳定和潜在不稳定方式的答案。

您的数据数组基本上是一个数组数组。使您的数据数组成为NSMutableArray,如下所示:

data = [[NSMutableArray alloc] initWithArray: data];

现在像这样删除空的封闭数组:

(稳定的方式)

NSMutableIndexSet *itemsToDiscard = [NSMutableIndexSet indexSet];
NSArray *item;
NSUInteger index = 0;

for (item in data) {
    if ([item count]<=0)
        [itemsToDiscard addIndex:index];
    index++;
}

[data removeObjectsAtIndexes:discardedItems];

或者通过这种根本不推荐的方法,但我只是把它放在那里,因为它对我有用。不过我建议你使用第一种方法。

(可能不稳定的方式)

for(id arr in data) {
    if ([arr isKindOfClass:[NSArray class]])
    {
       if(arr.count<=0)
       { 
          [data removeObject:arr];
       }
    }
}

这将删除数据中包含的空数组。

【讨论】:

  • 为什么要创建arr 数组?另外,如果一行中有两个空数组,此代码将失败。你需要反向迭代。
  • 我的坏@rmaddy 感谢您指出这一点。使用for每个循环怎么样?
  • 尽管我会接受反对票,但为您的理由发表评论会更有帮助,以便我可以改进答案。就像 rmaddy 一样,我改进了答案。
  • 您不能修改使用for in 循环迭代的数组。
  • 否,在使用 for in 时在可变数组上调用 removeObject: 会导致崩溃。
【解决方案2】:

由于您正在遍历一个在整个迭代过程中不断变化的数组,因此您必须使用 while 循环,条件是索引小于数组的大小,如下所示:

NSMutableArray *arrayContents = [NSMutableArray arrayWithObjects: @[@"abc", @"def"],@[@1,@2,@3], @[], nil];
NSLog( @"Pre while-loop: \n%@", arrayContents);
NSUInteger index = 0;
while (index < [arrayContents count]) {
    BOOL didRemove = false;
    if ([[arrayContents objectAtIndex: index] count] == 0) {
        [arrayContents removeObjectAtIndex: index];
        didRemove = true;

    }
    if (didRemove == false)
        index += 1;

}
NSLog( @"Post while-loop: \n%@", arrayContents);

如果没有删除任何内容,您将增加 index,但如果删除了某些内容,则不会增加 index。相反,您在同一 index 处再次循环,因为如果您在删除后增加索引,您将“跳过”一次迭代。

希望这适用于您的情况:)

【讨论】:

    【解决方案3】:

    简单的方法是遍历数组中的每个子数组,并检查它是否为空。由于您无法在循环时删除条目,因此您可以保留一个计数器并在之后将其删除。

    在 Swift 2.0 中

    var arrays = [["abc","def"],["ghi","jkl"],[], ["mno"], [], ["pqr"], [], ["stv"]]
    var numberToRemove = 0
    for idx in 0..<arrays.count {
    if arrays[idx].isEmpty {
        numberToRemove++
        arrays.insert(arrays.removeAtIndex(idx), atIndex: 0)
    }
    }
    
    arrays.removeRange(0..<numberToRemove)
    

    【讨论】:

    • 问题标记为 Objective-C。答案应使用正确的语言。
    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2022-01-05
    • 2011-10-01
    相关资源
    最近更新 更多