iOS: обновить NSMutableArray - PullRequest
0 голосов
/ 16 мая 2011

У меня есть этот код: Я хочу хранить некоторые вейлы в один день года, например, 15/05/2011 я установил период 20.05.2011

в viewDidLoad: Я сохраняю нулевое значение, затем могу хранить любое значение в массиве, я использую «значения часового»:

appDelegate.years = [[NSMutableArray alloc] init];

for (int i = 0; i < 50; i++) // I set 50 years
{
    [appDelegate.years insertObject:[NSNull null] atIndex:i];
}

months = [[NSMutableArray alloc] init];
for (int i = 0; i < 12; i++)
{
    [months insertObject:[NSNull null] atIndex:i];
}

days = [[NSMutableArray alloc] init];
for (int i = 0; i < 31; i++)
{
    [days insertObject:[NSNull null] atIndex:i];
}

В моем методе:

int firstDay = 15;
int lastDay = 20;
int firstMonth = 4; 
int lastMonth = 4;
NSString *string = first; //this is the value that I want to store in the period


for (int i = firstMonth; i < lastMonth+1; i++) 
{

    for (int j = firstDay; j < lastDay+1; j++)  
    {
        NSMutableArray *values = [[NSMutableArray alloc] init];
            [values addObject:string];
            [days replaceObjectAtIndex:j withObject: values];
            [values release];
    }

    [months replaceObjectAtIndex:i withObject:days];

}

[appDelegate.years replaceObjectAtIndex:0 withObject:months]; //0 is 2011

ОК, в этом коде я храню значение в массиве «values», которое храню в одном индексе массива «days», которое храню в одном индексе массива «month», которое храню в одном индексе массива «year». "это работает нормально; но после этого, если я хочу сохранить другую строку в значениях массива в той же позиции?

Пример: у меня есть другая строка NSString * string2 = "second", и я хочу сохранить эту строку в той же позиции дня, тогда я хочу в тот же день значения массива с "first" и "second", тогда я не могу do "[days replaceObjectAtIndex: j withObject: values];" но что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 16 мая 2011

С этим подходом я нахожу две проблемы -

  1. Ваш алгоритм итерации даты неверен. Это сработало бы для дат в том же месяце, но если бы вы рассматривали 15/4 - 20/5, тогда не все даты имели бы значение.
  2. Ваш текущий способ хранения значений неэффективен. Как насчет NSMutableDictionary? Выполняя итерации по датам, вы проверяете, существует ли дата (NSDate в качестве ключей может быть не очень хорошей идеей, поскольку у них тоже есть временные компоненты), а если нет, создайте изменяемый массив с текущим значением и установите его в качестве объекта. на сегодняшний день. Если он существует, получите изменяемый массив и добавьте к нему текущее значение. Таким образом, вы можете быстро получить все значения для даты, не увеличивая хранилище больше, чем нужно.

Однако, если вы хотите продолжить в том же духе, вам нужно внести некоторые изменения -

Для части значений,

if ([days objectAtIndex:j] == [NSNull null] ) {
    [days setObject:[NSMutableArray array] AtIndex:j];
}
NSMutableArray *values = [days objectAtIndex:j];
[values addObject:string];

Вам также нужно будет поступить с другими массивами аналогичным образом.

0 голосов
/ 16 мая 2011

Если я правильно понял, что вы пытаетесь сохранить второе значение в тот же день, верно?

Если нет особой необходимости выстраивать вашу структуру данных так, как вы в настоящее время, я быНастоятельно рекомендуем вам использовать простой массив с 365 днями.То, что у вас есть в настоящее время, напоминает древовидную структуру, что тоже хорошо, но сложно реализовать с массивами (и очень неэффективно с точки зрения памяти).

Кажется, вы забыли, что когда у вас есть массив, инициализированный в каком-либо месте в вашемдерево, вы можете просто добавить к этому существующему массиву.

Сказав это, вот мой вклад, основанный на вашем текущем решении:

for (int i = firstMonth; i <= lastMonth; i++) 
{
    for (int j = firstDay; j <= lastDay; j++)  // use <= instead of + 1, it's more intuitive
    {
        NSMutableArray* values = [days objectAtIndex:j];
        if (values == nil)
        {
            values = [[NSMutableArray alloc] init];
            [days insertObject:values atIndex:j];
        }
        [values addObject:string];
        [values release];
    }
    // This is unnecessary. days will never be something else than the current i-var days.
    //[months replaceObjectAtIndex:i withObject:days];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...