2012-07-11 11 views
14

W PHP jest to jedna linia kodu:Jaki jest najprostszy sposób na usunięcie pustych NSStrings z NSArray?

$array_without_empty_strs = array_filter($array_with_empty_strs); 

Jaki jest cel C odpowiednik?

UPDATE - Dodano następujący kod testowy, aby zilustrować zastosowanie rozwiązania Nikolai Ruhe za:

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

Odpowiedz

58

To jeszcze bardziej prosta:

[mutableArrayOfStrings removeObject:@""]; 

Jeśli tablica nie jest zmienny trzeba przed utworzeniem mutableCopy.

removeObject: usuwa obiekty z tablicy, która zwraca TAK z isEqual:.

1

Spójrz this question, który jest niemal dokładnie takie same.

Używam tej metody non-strunowych (Object) przypadków, które nie działają z NSPredicate

Gdzie tablica jest NSMutableArray

- (void) clearArrayOut 
{ 

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

I całkowicie prostu ukradł to z piękną odpowiedź rob mayoff w sprawie moje pytanie NSPredicate instead of loop to filter an array of objects

+0

To nie jest elastyczny w ogóle! W rzeczywistości jest to naprawdę bardzo zły sposób na rozwiązanie tego problemu, nie tylko pod względem wydajności. Spójrz na odpowiedź roba mayoffa, aby zobaczyć, jak jest elastyczna. – JustSid

+0

@DustinRowland Podany link pokazuje zupełnie inną odpowiedź niż Twoja! Powinieneś także zaznajomić się z predykatami, jeśli używasz czegoś takiego w swoim własnym kodzie, predykaty mogą odwoływać się do metod, obiekty niestandardowe nie są wymówką dla tego rodzaju kodu! – JustSid

+0

@DustinRowland Poza tym twój kod byłby znacznie szybszy, gdybyś zmniejszył 'j' zamiast ponownie uruchamiać pętlę. – JustSid

20
NSArray *noEmptyStrings = [maybeEmptyStrings filteredArrayUsingPredicate: 
    [NSPredicate predicateWithFormat:@"length > 0"]]; 
1

Oto alternatywna metoda, która jest jeszcze bardziej elastyczny niż przy użyciu Predica te.

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

możemy użyć NSPredicate tutaj mój kod

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

     NSArray *filtered = [yourArray filteredArrayUsingPredicate:pred]; 
Powiązane problemy