2015-11-02 4 views
-6

У меня есть один массив. В этом массиве я хочу проверить, свободен ли массив, а затем удалить его. Я пытаюсь проверить, что массив равен nil или count 0, но не работает.Как проверить пустой массив в Objective-C

Вот мой массив:

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

В массиве данных последний массив пуст, и я хочу, чтобы удалить из массива данных. Пожалуйста, предложите мне любую идею.

+0

У вас есть массив, отдельные элементы которого также являются массивом? и используете ли вы цель-c или быстро? – Usama

+0

http://stackoverflow.com/questions/13889285/how-to-check-value-null-and-replace-it-in-nsdictionary Попробуйте этот способ, решив ваши проблемы. –

+0

Я использую цель-c. –

ответ

0

Примечание:Вместо Downvoting, поскольку вопрос уже downvoted так это честная игра, попробуйте прочитать ответ первым, который содержит как стабильные и потенциально нестабильные пути.

Ваш массив данных в основном представляет собой массив массивов. Сделайте свой массив данных NSMutableArray так:

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

Теперь удалите пустые вложенные массивы, как это:

(Stable Way)

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

Это позволит удалить пустые массивы, вложенные в данных.

+0

Зачем создавать массив 'arr'? Кроме того, этот код не будет работать, если в строке есть два пустых массива. Вам нужно повторить итерацию. – rmaddy

+0

My bad @rmaddy благодарит за это. Как насчет использования для каждого цикла? – NSNoob

+0

Также как бы я согласился с downvotes, было бы более полезно оставить комментарий для вашей причины сделать так, чтобы я мог улучшить ответ. Как и рмадди, я улучшил ответ. – NSNoob

-1

Простым способом является просто прокрутить каждый подмассив в массиве и проверить, является ли он пустым. Поскольку вы не можете удалять записи во время цикла, вы можете просто сохранить счетчик и удалить их после.

В 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) 
+2

Вопрос помечен Цель-C. Ответы должны быть на правильном языке. – rmaddy

1

Поскольку вы перебор массива, который меняется в течение итерации, вы должны будете использовать 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, потому что если вы увеличите индекс после удаления, вы «пропустите» итерацию.

Надеюсь, это сработает для вашей ситуации :)

Смежные вопросы