0

我有一个 NSMutable 数组,其中插入了这样的元素:

[availableSeatsArray addObject:[NSString stringWithString:num_available]];

我想删除数组中值为零或更低的元素。我尝试使用它的 int 值甚至它的字符串值来检查元素的值,但它总是通过 '0' 元素大小写。数组前后的控制台输出如下。

for (int i=0;i<[availableSeatsArray count]; i++) {
        if ([[availableSeatsArray objectAtIndex:i] intValue] <= 0 || ([[availableSeatsArray objectAtIndex:i] isEqualToString:@"0"])) {
            NSLog(@"Removed index: %d", [[availableSeatsArray objectAtIndex:i] intValue]);
            [availableSeatsArray removeObjectAtIndex:i];
        }
}

控制台输出:

Available array: (
    "-2",
    10,
    5,
    "-5",
    0,
    10,
    10,
)
2012-08-14 11:13:28:002 -[dmbAddReservation viewWillAppear:] [Line 1074] Removed index: -2
2012-08-14 11:13:28:004 -[dmbAddReservation viewWillAppear:] [Line 1074] Removed index: -5
2012-08-14 11:13:28:006 -[dmbAddReservation viewWillAppear:] [Line 1083] Available array: (
    10,
    5,
    0, // I cannot explain why this element was not removed
    10,
    10,
)
4

4 回答 4

3

几点。

  1. 尝试使用integerValue而不是intValue
  2. 与其将数字的字符串表示形式存储在数组中,不如使用 anNSNumber代替。这就是它的用途。
  3. 在迭代它们时避免改变你的数组。

所以你创建你的数组:

[availableSeatsArray addObject:[NSNumber numberWithInteger:[num_available integerValue]]];

然后您可以将它们过滤掉(注意我使用的是基于块的枚举方法):

__block NSMutableArray *itemsToRemove;
[availableSetsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([obj integerValue] == 0]) {
        [itemsToRemove addObject:obj]
    }
}];

// Now that you've selected which objects to remove you can actually remove them.
[availableSetsArray removeObjectsInArray:itemsToRemove];
于 2012-08-14T15:36:16.657 回答
2

它正在跳过该元素,因为您要删除它之前的 -5 。 i递增到下一个值,并且该索引现在被前 10 个占用。可能有几种方法可以解决这个问题,但首先想到的是filteredArrayUsingPredicate:(参见NSArray 文档)。

于 2012-08-14T15:30:09.573 回答
2

问题是这种方法使用了一个根本有缺陷的逻辑。它错误地不会删除连续出现的 0 或负数对象。原因是,当您在 for 循环中检查“-5”时,它通过了测试,然后您将其删除,缩小数组并移动其剩余元素,以便“0”现在将代替“-5”。但是在 for 循环中,无论元素是否被删除,您都会推进循环变量(在这种情况下为 i),所以现在 'i' 指向零后的一。而且不会被检查。解决方案:只有在没有连续元素通过测试时才增加循环变量(即,将 if 更改为 while):

for (int i = 0; i < [availableSeatsArray count]; i++) {
    while ([[availableSeatsArray objectAtIndex:i] intValue] <= 0
       || ([[reservatiomAvailableArray objectAtIndex:i] isEqualToString:@"0"])) {
        NSLog(@"Removed index: %d", [[availableSeatsArray objectAtIndex:i] intValue]);
        [availableSeatsArray removeObjectAtIndex:i];
    }
}
于 2012-08-14T15:31:09.197 回答
2

我会去NSPredicatepredicateWithBlock:。对于 NSMutableArray,您可以使用filterUsingPredicate:从数组中删除不需要的对象而不创建新对象的方法。以下代码将执行此操作:

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"0",@"1",@"2", @"-50", nil];
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(NSString* evaluatedObject, NSDictionary *bindings) {
    return [evaluatedObject compare:@"0" options:NSNumericSearch] > 0;
}];
[arr filterUsingPredicate:predicate];
NSLog(@"%@", arr);
于 2012-08-14T15:41:39.477 回答