2009-08-14 31 views
27

Tôi có một NSDictionary trong đó mỗi khóa trỏ đến một mảng. Sau đó tôi muốn hợp nhất tất cả các giá trị thành một mảng. Có cách nào để sử dụng API để làm điều gì đó hiệu quả hơn nói:Hợp nhất NSArrays trong Mục tiêu-C

NSArray *anArray = [someDictionary allValues]; 
NSMutableArray *newArray = [NSMutableArray array]; 
start outter loop on anArray 
    start inner loop on objects in anArray 
    add objectAtIndex to newArray 
+0

Được trả lời trong http://stackoverflow.com/q/8569388/78336 – neoneye

Trả lời

59

Chỉ cần sử dụng [newArray addObjectsFromArray:anArray];

+0

Xin chào Ben, Nếu tôi làm theo cách này, tôi không có mảng phẳng. Tôi có một mảng các mảng. Tôi đã nhìn thấy nếu nó có thể làm điều đó mà không có vòng lặp. – Coocoo4Cocoa

+1

Điều này vẫn sẽ cung cấp cho bạn một mảng phẳng; bạn không thêm mảng, bạn đang thêm các đối tượng TỪ mảng. –

+1

Coocoo4Cocoa: Tôi nghĩ bạn đã nhầm lẫn 'addObject' **' FromArray: '** với' addObject: '. 'addObject:' thêm * mảng * vào mảng mới, trong khi Chuck và Ben Gottlieb đã gợi ý thêm các phần tử trong mảng vào mảng mới. –

19

Có một số nhầm lẫn trong câu trả lời Benn Gottlieb của trên. Để làm rõ, ông đề xuất sử dụng addObjectsFromArray thay vì vòng lặp bên trong, trong khi Coocoo bị nhầm lẫn vì ông cho rằng nó đang được đề xuất làm thay thế cho TẤT CẢ vòng lặp. (Nếu bạn làm điều này, bạn sẽ thực sự bị bỏ lại với một mảng flat của mảng theo sự phản đối của mình.)

Dưới đây là một giải pháp hợp lý thanh lịch mà không yêu cầu bất kỳ vòng lặp rõ ràng:

NSArray *anArray = [someDictionary allValues]; 
NSArray *flattenedArray = [anArray valueForKeyPath: @"@unionOfArrays.self"]; 

btw mã này sẽ để lại các bản sao trong mảng được làm phẳng. Nếu bạn muốn xóa các bản sao, hãy sử dụng riêng biệtUnionOfArrays thay vì unionOfArrays.

+6

Hôm nay, đây là giải pháp tốt hơn so với tất cả những điều trên. – Cezar

Các vấn đề liên quan