2013-05-07 3 views
1

У меня есть NSMutableDictionary сайтовКак бы использовать NSMutableArray с NSMutableDictionary

[dictionaryOfSites setObject:@"http://www.example.com" forKey:@"Example.com"]; 
[dictionaryOfSites setObject:@"http://www.site1.com" forKey:@"Site1"]; 
[dictionaryOfSites setObject:@"http://www.apple.com" forKey:@"Apple"]; 

Я знаю, что вы не можете сортировать словарь. Но я читал, что другие люди использовали NSMutableArray в качестве ключа, и массив можно сортировать.

Так что, если установка я новый массив

[[arrayKey alloc] initWithObjects:@"Example.com", @"Site1", @"Apple", nil]; 

Я бы тогда изменить свой первый фрагмент кода, чтобы

[dictionaryOfSites setObject:@"http://www.example.com" forKey:[arrayForKey objectAtIndex:0]]; 
[dictionaryOfSites setObject:@"http://www.site1.com" forKey:[arrayForKey objectAtIndex:1]]; 
[dictionaryOfSites setObject:@"http://www.apple.com" forKey:[arrayForKey objectAtIndex:2]]; 

В этой простой проблемы, у меня было 3 сайта, так что я «жесткий» закодировал. Как бы я сделал то же самое, если бы в моем списке сайтов было 100? Как будет поддерживаться порядок сайтов?

Если я сортирую свой массив [arrayKey sortUsingSelector: @selector (localizedCaseInsensitiveCompare :));

Не будет индексировать 2 стать индексом 0? Если он становится индексом 0, то вы можете видеть, что у словаряOfSites есть неправильная метка с URL-адресом.

+0

Лучшим способом было бы создать пользовательский класс, который представляет ваши сайты, и включает в себя два свойства: имя и URL, например. Затем вы создаете экземпляр класса, задаете два свойства и помещаете его в массив. Затем вы можете отсортировать массив на основе свойства имени объекта. – lnafziger

+0

Опубликуйте свой комментарий в качестве решения, чтобы вы могли получить кредит. Можете ли вы показать мне пример того, о чем вы говорите. Я очень смущен об этом – CocoaN00b

+0

Привет CocoaN00b, я обычно хотел бы, но я вышел из двери и не вернусь в сети в течение нескольких часов. Я просто хотел опубликовать это как быстрый комментарий, чтобы помочь указать вам в правильном направлении.Этот сайт (или должен быть) больше помогать людям, чем «получать кредит». Если вам все еще нужна помощь, когда я вернусь, я отправлю вам более полный пример, но, используя информацию из моего предыдущего комментария, вы сможете найти хорошие примеры, которые делают именно это, как здесь, так и в Google , Удачи! – lnafziger

ответ

1

Таким образом, вы можете использовать пользовательский класс (как я уже упоминал выше, в моем комментарии), или еще лучше использовать NSDictionary для хранения значений, как предложено MarkM.

EDIT: «Мне не нужно поддерживать словарь, его новое приложение с нуля».

Поскольку вам не нужно начинать с одного большого словаря, как вы опубликовали, было бы лучше просто сохранить отдельные словарные объекты для каждого сайта в массиве и не беспокоиться о преобразовании.

// Setup the initial array 
NSMutableArray *arrayOfSites = [NSMutableArray new]; 
[arrayOfSites addObject:@{@"Name" : @"Example.com", 
          @"URL" : @"http://www.example.com"}]; 
[arrayOfSites addObject:@{@"Name" : @"Site1", 
          @"URL" : @"http://www.site1.com"}]; 
[arrayOfSites addObject:@{@"Name" : @"Apple", 
          @"URL" : @"http://www.apple.com"}]; 

// At this point, arrayOfSites contains a dictionary object for each site. 
// Each dictionary contains two keys: Name and URL with the appropriate objects. 
// Now we just need to sort the array by the Name key in the dictionaries: 
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES]; 
[arrayOfSites sortUsingDescriptors:[NSArray arrayWithObjects:descriptor, nil]]; 

NSLog(@"%@", arrayOfSites); 

Результаты:

2013-05-07 18:19:08.386 Testing App[75712:11f03] (
     { 
     Name = Apple; 
     URL = "http://www.apple.com"; 
    }, 
     { 
     Name = "Example.com"; 
     URL = "http://www.example.com"; 
    }, 
     { 
     Name = Site1; 
     URL = "http://www.site1.com"; 
    }) 

Для доступа к данным, можно использовать:

NSString *name = [[arrayOfSites objectAtIndex:indexPath.row] objectForKey:@"Name"]; 

Обратите внимание, что arrayOfSites должен быть объявлен собственностью вашего класса, так что вы можете получить доступ к это от разных методов.

+0

Мне не нужно поддерживать словарь. его новое приложение с нуля. – CocoaN00b

+0

В чем разница между NSMutableDictionary? Я думал, что NSMutableDictionary позволил мне добавлять/удалять объекты. В то время как NSDictionary не может измениться – CocoaN00b

+0

Я следовал вашим советам, и новый MutableArray хранит словарь. Как я могу получить доступ к имени, URL-адресу, чтобы я мог поместить его в свой UITableView – CocoaN00b

0

Что вам нужно сделать, это сохранить объекты NSDictionary в массиве, а затем получить доступ к значению из этого массива, чтобы выполнить сортировку, если хотите. Фактически вы не храните новую строку для сортировки. Вы просто проверяете значение определенного ключа в словаре по индексу в массиве.

Here является хорошим источником для сортировки массива словарей

+0

Я думаю, что вы имеете в виду создать один объект NSDictionary для каждого сайта и хранить каждый из них в массиве (просто чтобы помочь уточнить для человека, задающего вопрос). – lnafziger

+0

Исправить. Вы можете проверить значение dict в массиве, чтобы искать имена для сортировки. –

+1

http://stackoverflow.com/questions/2393386/best-way-to-sort-an-nsarray-of-nsdictionary-objects –

Смежные вопросы