2013-07-31 25 views
12

Tôi đang liên lạc với một API gửi trả lại NSDictionary dưới dạng phản hồi với dữ liệu mà ứng dụng của tôi cần (dữ liệu về cơ bản là nguồn cấp dữ liệu). Dữ liệu này được sắp xếp từ mới nhất đến cũ nhất, với các mục mới nhất ở phía trước của NSDictionary.Với liệt kê nhanh và NSDictionary, việc lặp lại theo thứ tự các khóa không được đảm bảo - làm thế nào tôi có thể tạo nó theo thứ tự IS?

Khi tôi nhanh chóng liệt kê chúng với for (NSString *key in articles) { ... } đơn đặt hàng dường như là ngẫu nhiên, và do đó thứ tự tôi hoạt động trên chúng không phải theo thứ tự từ mới đến cũ nhất, như tôi muốn, thay vào đó là ngẫu nhiên.

Tôi đã đọc và khi sử dụng liệt kê nhanh với NSDictionary, nó không được đảm bảo lặp lại theo thứ tự thông qua mảng.

Tuy nhiên, tôi cần. Làm thế nào để làm cho nó lặp qua NSDictionary theo thứ tự mà NSDictionary đang ở?

+0

Viết từ điển của riêng bạn, sau đó. Nếu CF/NSDictionary nói rằng họ không thể đảm bảo trật tự, thì họ không thể đảm bảo trật tự. Nó có thể không được tất cả những khó khăn để viết một thuật toán phân loại tốt, nhưng nếu bạn cần chúng theo thứ tự chèn có thể được khôn lanh mà không cần gắn thẻ các đối tượng bằng cách nào đó. – CodaFi

+0

Bạn có bất kỳ đầu vào nào trên API không? Có vẻ như nó sẽ gửi cho bạn một mảng, không phải từ điển. –

Trả lời

20

Một cách có thể để có được tất cả các phím trong một mảng có thể thay đổi:

NSMutableArray *allKeys = [[dictionary allKeys] mutableCopy]; 

Và sau đó sắp xếp các mảng yêu cầu của bạn:

[allKeys sortUsingComparator: ....,]; //or another sorting method 

Sau đó bạn có thể lặp qua mảng (sử dụng nhanh liệt kê ở đây giữ trật tự, tôi nghĩ) và nhận các giá trị từ điển cho khóa hiện tại:

for (NSString *key in allKeys) { 
    id object = [dictionary objectForKey: key]; 
    //do your thing with the object 
} 
+0

Tại sao 'mutableCopy'? Tôi nghĩ tốt hơn là chỉ sử dụng '[dictionary allKeys]'. – Jaybo

+2

Vì ngay sau đó mảng allKeys được sắp xếp.Mà chỉ có thể bởi a) làm cho nó một mảng mutable hoặc b) tạo ra khác, sắp xếp, mảng (như trong câu trả lời rmaddys). Đó là một sự lựa chọn của sở thích và bất cứ điều gì là tốt như khác. Nhưng tốt đẹp để bình luận về 2yr cũ này, chấp nhận câu trả lời;) – Mario

+0

Hy, kiểm tra câu trả lời của tôi ở đây: http://stackoverflow.com/questions/32986/nsenumerator-performance-vs-for-loop-in-cocoa/30720339#30720339 –

9

Từ điển, theo định nghĩa, không có thứ tự. Nếu bạn muốn áp dụng một thứ tự cho các phím, bạn cần phải sắp xếp các phím.

NSArray *keys = [articles allKeys]; 
NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(compare:)]; 
for (NSString *key in sortedKeys) { 
    // process key 
} 

Cập nhật cách khóa được sắp xếp cho phù hợp với nhu cầu của bạn.

3

Như mọi người nói, bạn không thể garantee trật tự trong NSDictionary. Và đôi khi việc đặt hàng thuộc tính allKeys không phải là thứ bạn thực sự muốn. Nếu những gì bạn thực sự muốn là liệt kê lệnh của bạn theo thứ tự các khóa của bạn được chèn vào dict của bạn, bạn có thể tạo một thuộc tính/biến NSMutableArray mới để lưu trữ khóa của bạn, vì vậy chúng sẽ giữ nguyên thứ tự của nó.

Mỗi lần bạn sẽ chèn một khóa mới trong dict, chèn nó vào trong mảng của bạn:

[articles addObject:someArticle forKey:@"article1"]; 
[self.keys addObject:@"article1"]; 

Để liệt kê chúng theo thứ tự, chỉ cần làm:

for (NSString *key in self.keys) { 
    id object = articles[key]; 
} 
4

Bạn cũng có thể trực tiếp liệt kê như thế này:

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init]; 

for (NSString* key in xyz) { 
    id value = [xyz objectForKey:key]; 
    // do stuff 
} 



Điều này được lấy từ câu trả lời được cung cấp bởi zneak trong câu hỏi: for each loop in objective c for accessing NSMutable dictionary

+0

Câu trả lời này phải hoạt động như thế nào? 'xyz' là một mảng trống không có khóa nào trong đó. – rmaddy

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