2012-08-14 31 views
0

的元件的整數值我有一個NSMutable陣列插入這樣的元件:檢查0作爲從一個的NSMutableArray

[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, 
) 
+1

這就是爲什麼你不應該枚舉它時修改數組。 – 2012-08-14 15:24:01

+1

+1 @ H2CO3,在枚舉過程中不要修改。通過過濾你想要的元素來創建一個新的數組。 – Ravi 2012-08-14 15:28:00

+0

...或者在枚舉數組**的**副本**時修改原始數組;或者 – 2012-08-14 15:30:03

回答

2

問題是,這種方法使用了根本上有缺陷的邏輯。它錯誤地不會刪除連續出現的0或負面對象。原因是,當你在for循環中檢查「-5」時,它通過測試,然後移除它,縮小數組,並移動其餘的元素,以便現在「0」代替「-5」。但是在for循環中,無論元素是否被刪除,你都會推進循環變量(在本例中爲i),所以現在'i'指向一個超過零的元素。它不會被檢查。解決方法:只增加循環變量是否有經過測試沒有連續元素(也就是E更改,如果到時):

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]; 
    } 
} 
+0

謝謝,先生,好! – anuragbh 2012-08-14 15:39:08

+0

@anuragbh不客氣。 – 2012-08-14 15:40:54

2

它跳過元素,因爲你之前的-5它刪除。 i遞增到下一個值,並且該索引現在被前10個佔用。圍繞此可能有幾種方法,但首先想到的是filteredArrayUsingPredicate:(參見NSArray documentation)。

3

幾個百分點。

  1. 嘗試使用integerValue代替intValue
  2. 而不是存儲陣列中的一些字符串表示,只需使用一個NSNumber來代替。這就是它的目的。
  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]; 
+0

+1,這也是一個優雅的解決方案。 – 2012-08-14 15:40:31

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