2012-07-11 26 views
14

Trong PHP đó là một dòng mã:Cách dễ nhất để xóa NSStrings trống khỏi NSArray là gì?

$array_without_empty_strs = array_filter($array_with_empty_strs); 

C tương đương với mục tiêu là gì?

CẬP NHẬT - Nhập mã kiểm tra sau đây để minh họa cho việc sử dụng các giải pháp Nikolai Ruhe của:

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

Trả lời

58

Nó thậm chí còn đơn giản hơn:

[mutableArrayOfStrings removeObject:@""]; 

Nếu mảng của bạn là không thể thay đổi bạn phải tạo một mutableCopy trước.

removeObject: xóa tất cả đối tượng từ mảng trả về CÓ từ isEqual:.

1

Nhìn vào this question, đó là gần như giống hệt nhau như bạn.

tôi sử dụng phương pháp này cho không theo chuỗi (object) Các trường hợp không làm việc với NSPredicate

đâu mảng là NSMutableArray

- (void) clearArrayOut 
{ 

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

Và tôi hoàn toàn chỉ lấy trộm này từ câu trả lời đẹp cướp mayoff về câu hỏi của tôi NSPredicate instead of loop to filter an array of objects

+0

Đây không phải là linh hoạt ở tất cả! Trong thực tế, nó thực sự là một cách thực sự xấu để giải quyết vấn đề này, không chỉ hiệu suất khôn ngoan. Nhìn vào câu trả lời của rob mayoff để xem nó hoạt động như thế nào. – JustSid

+0

@DustinRowland Liên kết bạn đưa ra hiển thị một câu trả lời hoàn toàn khác với câu trả lời của bạn! Ngoài ra, bạn nên làm cho mình quen thuộc với các vị từ nếu bạn sử dụng một cái gì đó như thế này trong mã của riêng bạn, các biến vị ngữ CÓ THỂ gọi các phương thức, các đối tượng tùy chỉnh không phải là một cái cớ cho loại mã này! – JustSid

+0

@DustinRowland Bên cạnh đó, mã của bạn sẽ nhanh hơn nhiều nếu bạn giảm 'j' thay vì bắt đầu lặp lại. – JustSid

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

Đây là phương pháp thay thế linh hoạt hơn thậm chí sử dụng predica te.

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

chúng ta có thể sử dụng NSPredicate đây mã của tôi

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

     NSArray *filtered = [yourArray filteredArrayUsingPredicate:pred]; 
Các vấn đề liên quan