2012-07-11 15 views
14

En PHP es una línea de código:¿Cuál es la forma más fácil de eliminar NSStrings vacíos de un NSArray?

$array_without_empty_strs = array_filter($array_with_empty_strs); 

¿Cuál es el objetivo de C equivalente?

ACTUALIZACIÓN - Se ha añadido el siguiente código de prueba para ilustrar el uso de la solución de Nikolai Ruhe:

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

Respuesta

58

es aún más sencilla:

[mutableArrayOfStrings removeObject:@""]; 

Si la matriz no es mutable usted tiene que crear un mutableCopy antes.

removeObject: elimina todos objetos de una matriz que volver SÍ de isEqual:.

1

Mira this question, que es casi exactamente el mismo que el suyo.

Puedo usar este método para casos que no son cadenas (objeto) que no funcionan con NSPredicate

Dónde matriz es NSMutableArray

- (void) clearArrayOut 
{ 

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

Y estoy totalmente acaba de robar esto desde hermosa respuesta de Rob mayoff en mi pregunta NSPredicate instead of loop to filter an array of objects

+0

Esto no es flexible en absoluto! De hecho, es una manera realmente muy mala de resolver este problema, no solo en cuanto a rendimiento. Mira la respuesta de rob mayoff para ver cómo se hace flexible. – JustSid

+0

@DustinRowland ¡El enlace que brindó muestra una respuesta completamente diferente a la suya! Además, debe familiarizarse con los predicados si utiliza algo como esto en su propio código, los predicados PUEDEN invocar métodos, ¡los objetos personalizados no son una excusa para este tipo de código! – JustSid

+0

@DustinRowland Además, su código sería mucho más rápido si disminuyese 'j' en lugar de comenzar nuevamente el ciclo. – JustSid

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

He aquí un método alternativo que es incluso más flexible que el uso de una predica te

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

podemos utilizar NSPredicate aquí mi código

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

     NSArray *filtered = [yourArray filteredArrayUsingPredicate:pred]; 
Cuestiones relacionadas