Удалите повторяющиеся пользовательские объекты из массива NSMutable, сохранив новейшие повторяющиеся объекты.

У меня есть NSMutableArray пользовательских объектов. Каждый содержит уникальную строку идентификатора, и каждый содержит свойство downloadedDate.

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

В настоящее время я делаю следующее, чтобы удалить дубликаты, но при этом не учитывается сохранение объекта с самой новой датой.

NSArray *originalArray = [NSArray arrayWithArray:mutableItems];
NSMutableArray *uniqueArray = [NSMutableArray array];
NSMutableSet *names = [NSMutableSet set];
for (ZSSObject *g in originalArray) {
    NSString *destinationName = g.code;
    if (![names containsObject:destinationName]) {
        [uniqueArray addObject:g];
        [names addObject:destinationName];
    }
}
NSArray *uniqueObjects = uniqueArray;

Объекты создаются так:

ZSSObject *obj = [ZSSObject alloc] init];
obj.code = @"12345";
obj.downloadedDate = [NSDate date];

Есть ли более простой способ сделать то, что я хочу, чем иметь кучу копий моего массива и вложенных циклов?


person Nic Hubbard    schedule 12.05.2016    source источник
comment
Похоже, вы должны использовать словарь, а не массив. Затем вы можете проверить дату, прежде чем добавлять новый объект в словарь.   -  person Paulw11    schedule 13.05.2016
comment
Думаю, сортировка originalArray перед циклом по убыванию даты решит вашу проблему.   -  person meth    schedule 13.05.2016
comment
@Paulw11Paulw11 - я только что опубликовал ответ, дайте мне знать, если вы думали об этом.   -  person Nic Hubbard    schedule 13.05.2016


Ответы (1)


Используя вместо этого предложение использовать NSDictionary, я придумал это решение:

NSMutableDictionary *objDict = [[NSMutableDictionary alloc] init];
for (ZSSObject *g in mutableItems) {

    ZSSObject *addedObj = objDict[g.code];

    if (addedObj) {

        // Compare dates
        if ([addedObj respondsToSelector:@selector(dateDownloaded)]) {

            if ([g.dateDownloaded compare:addedObj.dateDownloaded] == NSOrderedDescending) {

                [objDict setObject:g forKey:g.code];

            }

        }

    } else {
        [objDict setObject:g forKey:g.code];
    }
}

NSArray *uniqueObj = objDict.allValues;
person Nic Hubbard    schedule 12.05.2016
comment
Да, это то, что я бы сделал - person Paulw11; 13.05.2016