2011-01-16 11 views
12

Tôi có một số lớn NSDictionary mà tôi cần lặp lại và tạo riêng biệt NSArray s. Dưới đây là các nội dung:Lặp qua NSDictionary để tạo NSArrays riêng biệt

(
     { 
     id =   { 
      text = ""; 
     }; 
     sub =   { 
      text = " , "; 
     }; 
     text = ""; 
     "thumb_url" =   { 
      text = ""; 
     }; 
     title =   { 
      text = "2010-2011"; 
     }; 
     type =   { 
      text = "title"; 
     }; 
    }, 
     { 
     id =   { 
      text = "76773"; 
     }; 
     sub =   { 
      text = "December 13, 2010"; 
     }; 
     text = ""; 
     "thumb_url" =   { 
      text = "http://www.puc.edu/__data/assets/image/0004/76774/varieties/thumb.jpg"; 
     }; 
     title =   { 
      text = "College Days - Fall 2010"; 
     }; 
     type =   { 
      text = "gallery"; 
     }; 
    }, 
     { 
     id =   { 
      text = ""; 
     }; 
     sub =   { 
      text = ""; 
     }; 
     text = ""; 
     "thumb_url" =   { 
      text = ""; 
     }; 
     title =   { 
      text = "2009-2010"; 
     }; 
     type =   { 
      text = "title"; 
     }; 
    }, 
     { 
     id =   { 
      text = "76302"; 
     }; 
     sub =   { 
      text = "December 3, 2010"; 
     }; 
     text = ""; 
     "thumb_url" =   { 
      text = "http://www.puc.edu/__data/assets/image/0019/76303/varieties/thumb.jpg"; 
     }; 
     title =   { 
      text = "Christmas Colloquy"; 
     }; 
     type =   { 
      text = "gallery"; 
     }; 
    } 
) 

Mỗi phần có khóa loại, mà tôi cần kiểm tra. Khi tìm thấy khóa title, tôi cần phải thêm khóa đó vào một mảng. Sau đó, các phần tiếp theo sẽ sử dụng phím gallery cần phải nằm trong mảng riêng của nó cho đến khi nó tìm thấy một khóa title khác. Sau đó, các phím gallery sau đó vào mảng riêng của chúng.

Tôi đang sử dụng một tiêu đề và nội dung của phần UITableView. Do đó, NSDictionary ở trên phải có một mảng NSArray *titles; và hai mảng khác chứa mỗi thư viện đến sau tiêu đề.

Tôi đã thử sử dụng vòng lặp for nhưng tôi dường như không thể làm đúng. Có những câu chuyện mới trên trang chủ.

Trả lời

25

Có phần không rõ ràng bởi nhật ký của bạn, nhưng tôi đoán số NSDictionary của bạn có giá trị là NSDictionary? Nếu vậy:

NSMutableArray *titles = [NSMutableArray array]; 
// etc. 

for (id key in sourceDictionary) { 
    NSDictionary *subDictionary = [sourceDictionary objectForKey:key]; 
    if ([subDictionary objectForKey:@"type"] == @"title") 
    [titles addObject:[subDictionary objectForKey:@"title"]]; 
    // etc. 
} 

Câu hỏi của bạn không rõ ràng ... nhưng đây là cách bạn lặp lại đúng cách NSDictionary.

EDIT:

NSMutableDictionary *galleries = [NSMutableDictionary dictionary]; 
NSString *currentTitle; 

for (id key in sourceDictionary) { 
    NSDictionary *subDictionary = [sourceDictionary objectForKey:key]; 
    NSString *type = [subDictionary objectForKey:@"type"]; 
    if (type == @"title") { 
    currentTitle = [subDictionary objectForKey:@"title"]; 
    if ([galleries objectForKey:currentTitle] == nil) 
     [galleries setObject:[NSMutableArray array] forKey:currentTitle]; 
    } else if (type == @"gallery" && currentTitle != nil) 
    [[galleries objectForKey:currentTitle] addObject:subDictionary]; 
} 

Sau vòng này, galleries sẽ chứa các phím kiểu NSString (với các giá trị của các chức danh), và các đối tượng của loại NSArray tương ứng (với các giá trị của bộ sưu tập NSDictionarys). Hy vọng rằng đây là những gì bạn đang đi.

+0

Vâng, NSDictionary của tôi có giá trị của NSDicitonary. –

+0

Như bạn có thể thấy, sau mỗi khóa tiêu đề, có một vài từ điển khác không sử dụng phím tiêu đề. Vì vậy, nếu thêm 5 từ điển xuất hiện sau từ điển khóa tiêu đề, tôi muốn đặt 5 từ đó vào một mảng mới. Sau đó, nếu tôi thấy một khóa tiêu đề khác, hãy đặt những NSDictionaries sau vào một mảng. –

+0

Tôi hiểu. Vấn đề duy nhất tôi có thể nghĩ đến đó là một NSDictionary là một bộ khóa/giá trị không được bảo đảm theo thứ tự bạn có thể mong đợi. Tuy nhiên, tôi sẽ chỉnh sửa câu trả lời của tôi cho phù hợp. – Skyler

14
NSString *key; 
for(key in someDictionary){ 
    NSLog(@"Key: %@, Value %@", key, [someDictionary objectForKey: key]); 
} 
1

Modern cú pháp Objective-C:

NSMutableArray *things = [NSMutableArray array]; 
NSMutableArray *stuff = [NSMutableArray array]; 
NSMutableArray *bits = [NSMutableArray array]; 

[dictionaries enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
    [things addObject:[obj valueForKeyPath:@"thing"]]; 
    [stuff addObject:[obj valueForKeyPath:@"enclosing_object.stuff"]]; 
    [bits addObject:[obj valueForKeyPath:@"bits"]]; 
}];