2010-08-02 24 views

Trả lời

8

Nếu bạn hoàn toàn phải sử dụng vùng chứa từ điển, bạn phải sử dụng khóa có thể sắp xếp theo thứ tự mà bạn thêm cặp khóa-giá trị. Vì vậy, khi tạo từ điển của bạn, bạn sử dụng một khóa là một số nguyên tự động tăng hoặc tương tự. Sau đó, bạn có thể sắp xếp trên các phím (số nguyên) và truy xuất các giá trị được liên kết với các khóa đó.

Nếu bạn làm tất cả điều đó, tuy nhiên, bạn cũng có thể chỉ cần sử dụng NSMutableArray và thêm giá trị vào mảng trực tiếp! Nó sẽ nhanh hơn và yêu cầu ít mã hơn. Bạn chỉ cần lấy đối tượng theo thứ tự:

for (id obj in myArray) { /* do stuff with obj... */ } 
7

NSMutableDictionary không thể thực hiện điều đó. Hãy xem ví dụ: Matt Gallaghers OrderedDictionary.

+0

Nhưng bạn có thể cho tôi biết cách sử dụng Lớp này không? – iWatch

2

Tôi đã viết một phương pháp nhanh chóng để mất một mảng nguồn (các đối tượng là tất cả ra về trật tự) và một mảng tài liệu tham khảo (có đối tượng trong một mong muốn (và hoàn toàn tùy ý) thứ tự) và trả về một mảng trong đó các mục của mảng nguồn đã được sắp xếp lại để phù hợp với mảng tham chiếu.

- (NSArray *) reorderArray:(NSArray *)sourceArray toArray:(NSArray *)referenceArray 
{ 
    NSMutableArray *returnArray = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < [referenceArray count]; i++) 
    { 
     if ([sourceArray containsObject:[referenceArray objectAtIndex:i]]) 
     { 
      [returnArray addObject:[arrReference objectAtIndex:i]]; 
     } 
    } 
    return [returnArray copy]; 
} 

Lưu ý rằng điều này rất mong manh. Nó sử dụng phương thức containsObject: của NSArray, cuối cùng sẽ gọi NSObject's isEqual:. Về cơ bản, nó sẽ hoạt động tốt đối với các mảng NSString s, NSNumber s và có thể là NSDate s (chưa thử), nhưng bên ngoài đó, YMMV. Tôi tưởng tượng nếu bạn cố gắng vượt qua mảng UITableViewCell s hoặc một số đối tượng thực sự phức tạp khác, nó sẽ hoàn toàn sh * t chính nó, và một trong hai tai nạn hoặc trả lại tổng số rác thải. Tương tự như vậy nếu bạn đã làm một cái gì đó như vượt qua một mảng của NSDate s làm mảng tham chiếu và một mảng của NSString s làm mảng nguồn. Ngoài ra, nếu mảng nguồn chứa các mục không nằm trong mảng tham chiếu, chúng sẽ bị loại bỏ. Người ta có thể giải quyết một số vấn đề này bằng cách thêm một chút mã.

Tất cả những gì đã nói, nếu bạn đang cố gắng làm điều gì đó đơn giản, nó sẽ hoạt động tốt. Trong trường hợp của bạn, bạn có thể xây dựng mảng tham chiếu khi bạn đang lặp qua setValue:forKey: của mình.

NSMutableArray *referenceArray = [[NSMutableArray alloc] init]; 
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init]; 

for (//whatever you are looping through here) 
{ 

    [yourDictionary setValue://whatever forKey:key]; 
    [referenceArray addObject:key]; 

} 

Sau đó, khi bạn muốn để lặp qua các mục của bạn theo thứ tự họ bước vào, bạn chỉ

for (NSString *key in [self reorderArray:[myDict allKeys] toArray:referenceArray]) 
+0

Đây là một giải pháp thực sự khá tốt. Cảm ơn – darwindeeds

+0

Không cần sử dụng đoạn mã đầu tiên trong câu trả lời của bạn ở trên. Một khi bạn đã thiết lập các khóa trong mảng tham chiếu như bạn làm ở trên, nơi bạn đặt khóa trong referenceArray, bạn không còn cần phải gây rối với phương thức mảng "tham chiếu nguồn" (phương thức đầu tiên ở trên) vì một mảng chứa các giá trị trong "ORDER" ". Bạn có thể chỉ cần lặp qua tham chiếu đến và lấy các đối tượng từ "yourDictionary" theo thứ tự như "Ganesh" được chỉ ra trong bài đăng dưới đây: cho (khóa NSString * trong referenceArray) { // lấy đối tượng từ từ điển id object = [yourDictionary objectForKey: key]; } – programmer

0

Trên thực tế bạn có một mảng tài liệu tham khảo theo cách trật tự thì tại sao bạn cần phải thêm vào một nhiều mảng.Vì vậy, tôi đoán cách tiếp cận này là không tốt. Xin vui lòng xem xét ý kiến ​​của tôi.

0

Mặc dù câu trả lời @GenralMike 's làm việc dễ dàng, nó có thể được tối ưu hóa bằng cách rời khỏi mã không cần thiết như sau:

1) Giữ một mảng để chứa tài liệu tham khảo cho các phím từ điển theo thứ tự chúng được thêm vào.

NSMutableArray *referenceArray = [[NSMutableArray alloc] init]; 
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init]; 

for (id object in someArray) { 

    [yourDictionary setObject:object forKey:someKey]; 
    [referenceArray addObject:someKey]; // add key to reference array 

} 

2) Bây giờ "referenceArray" chứa tất cả các phím theo thứ tự, Vì vậy, bạn có thể truy xuất các đối tượng từ từ điển theo cùng thứ tự như chúng đã được thêm vào từ điển.

for (NSString *key in referenceArray){ 
    //get object from dictionary in order 
    id object = [yourDictionary objectForKey:key]; 
} 
Các vấn đề liên quan