2013-04-26 2 views
3

Я пытаюсь удалить любые дубликаты из моего отсортированного массива ... Я думал, что смогу сделать это, используя пример из другого вопроса, но, похоже, он даже не приблизился к работе.удалить дубликат valuse из NSMutable array

его довольно ужасная попытка, но его единственный способ я могу выяснить, как сравнить два элемента одного элемента (NSDictionary) в NSMutableArray.

Вот мой пример кода

Я в настоящее время есть отсортированный массив

NSArray *duplicatesRemovedArray = [sortedArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
     NSDictionary *dictA = a; 
     NSDictionary *dictB = b; 

     NSString *startYear1 = dictA[kStartYear]; 
     NSString *finishYear1 = dictA[kFinishYear]; 
     NSString *allYear1 = [NSString stringWithFormat:@"%@%@",startYear1, finishYear1]; 
     NSString *startYear2 = dictB[kStartYear]; 
     NSString *finishYear2 = dictB[kFinishYear]; 
     NSString *allYear2 = [NSString stringWithFormat:@"%@%@",startYear2, finishYear2]; 

     return [allYear1 compare:allYear2]; 

    }]; 

если у кого есть какие-либо идеи о том, как создать NSArray уникальных предметов, что я после этого, если вы могли бы дать мне какие-либо предложения, примеры кода, которые будут весьма благодарны

Обновление: Я должен отметить, что мой NSDictionary есть еще один элемент в нем идентификатор ...

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

ID: 1234 
STARTYEAR: 1999 
FINISHYEAR: 2000 

поэтому мне нужна помощь удаления объектов StartYear и чей FinishYear матч другие объекты начала и окончания года.

+1

возможно дубликат [Лучший способ удалить повторяющиеся значения из NSMutableArray в Objective-C?] (HTTP: // StackOverflow .com/questions/1025674/the-best-way-to-remove-duplicate-values-from-nsmutablearray-in-objective-c), http://stackoverflow.com/questions/3966592/removing-duplicates-in- nsarray, http://stackoverflow.com/questions/3882515/remove-duplicates-nsmutablearray, http://stackoverflow.com/questions/5978574/removing-duplicates-from-nsmutablearray, среди [других] (https: // www .google.com/д = сайт поиска: + удалить stackoverflow.com + дубликаты + ск rray). –

+0

@JoshCaswell бит, с которым у меня возникают проблемы, заключается в том, что каждый объект NSDictionary имеет два элемента. Мне нужно, чтобы мой метод отключился от этого факта. Большинство, если не все ваши примеры, просто показывают массивы с одиночными элементами .. другими словами одно значение даты вместо проверки двух значений даты на объект –

ответ

7

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

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

NSArray *array = @[@{@"ID": @(1234), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2001)}, 
        @{@"ID": @(1235), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2001)}, 
        @{@"ID": @(1236), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2000)}, 
        @{@"ID": @(1237), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2000)}]; 

NSMutableArray *duplicatesRemoved = [NSMutableArray array]; 
NSMutableSet *seenYears = [NSMutableSet set]; 
for (NSDictionary *item in array) { 
    //Extract the part of the dictionary that you want to be unique: 
    NSDictionary *yearDict = [item dictionaryWithValuesForKeys:@[@"STARTYEAR", @"FINISHYEAR"]]; 
    if ([seenYears containsObject:yearDict]) { 
     continue; 
    } 
    [seenYears addObject:yearDict]; 
    [duplicatesRemoved addObject:item]; 
} 
NSLog(@"%@", duplicatesRemoved); 

В этом примере, это привело бы к этим двум пунктам:

{ FINISHYEAR = 2001; ID = 1234; STARTYEAR = 1999; } 
{ FINISHYEAR = 2000; ID = 1236; STARTYEAR = 1999; } 
+0

да, это именно то, чего я пытаюсь достичь. Я дам вашему ответу попытку сейчас и дам вам знать, как я иду. –

+0

святая моли .. это сработало. Человек, я несколько раз возвращаюсь к этой проблеме, надеясь, что в какой-то момент я пойму и решу это, или кто-то поймет, что я прошу и помогу мне .. Большое вам спасибо ... Я очень благодарен твоя помощь .. о человек .. чувствует себя так хорошо, что проблема с моего пути ... спасибо тонну! –

1

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

Вот пример:

NSArray *a = @[@"a", @"b", @"a", @"c", [NSString stringWithFormat:@"%@", @"a"]]; 
NSLog(@"a is: %@", a); 
NSSet *s = [NSSet setWithArray:a]; 
NSArray *b = [s allObjects]; 
NSLog(@"b is: %@", s); 

Вывод из приведенных выше выглядит следующим образом:

a is: (
    a, 
    b, 
    a, 
    c, 
    a 
) 
b is: {(
    b, 
    c, 
    a 
)} 

Итак, b представляет собой массив, содержащий все различные объекты из a. Более короткая версия, которая делает то же самое:

NSArray *a = @[@"a", @"b", @"a", @"c", [NSString stringWithFormat:@"%@", @"a"]]; 
NSArray *b = [[NSSet setWithArray:a] allObjects]; 

Если вы сделать заботы о порядке, то у вас есть два варианта: использовать метод выше и реорганизовать объекты после этого, или использовать другой метод. Если вы хотите, чтобы объекты оставались отсортированными, вы можете, конечно, просто отсортировать результирующий массив различных объектов, чтобы восстановить отсортированный порядок. В качестве альтернативы, если массив отсортирован, вы можете использовать тот факт, что сортировка приведет к тому, что дублирующие объекты окажутся рядом друг с другом. Итак, просто просмотрите массив, сравнивая каждый элемент с последующим элементом, и удалите первый, если они будут одинаковыми.

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

мне нужна помощь удаления объектов WHOS StartYear и FinishYear матча

Это немного сложнее, но не так много. Рассмотрим способ удаления дубликатов путем сортировки, о которой я говорил выше.Если вы сортируете свой массив словарей с помощью startYear и finishYear в качестве ключей, вы должны получить массив, в котором объекты, имеющие одинаковый год начала и окончания, будут смежными. То есть все объекты с тем же самым началом года будут сгруппированы вместе, и в каждом кластере все объекты, имеющие тот же год окончания, будут сгруппированы вместе. Вы можете легко сортировать эту информацию, используя -sortedArrayUsingDescriptors:. Вот как вы бы идти о нем:

NSSortDescriptor *start = [NSSortDescriptor sortDescriptorWithKey:@"startYear" ascending:YES]; 
NSSortDescriptor *finish = [NSSortDescriptor sortDescriptorWithKey:@"finishYear" ascending:YES]; 
NSArray *sortedArray = [unsortedArray sortedArrayUsingDescriptors:@[start, finish]]; 

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

+0

Я только что закончил чтение, в котором я вижу, что вы можете сравнивать объекты в целом друг с другом ... Что-то, чего я не хотел, было возможно, в моем первоначальном вопросе я пренебрег упомянуть еще один элемент в NSDictionary, думая, что это не имеет никакого отношения к удалению дубликатов, основанных на стартеYear finishYear .. Похоже, вы предложили аналогичное решение, которое буквально за минуту или две до вашего ответа было отправлено. Я обновил свой вопрос для определения лица у меня есть уникальное значение элемента в моем NSDictionary .. –

+0

whoops .. только что играли с thew код .. я не видел твое обновление .. сейчас буду читать :) –

+0

Черт! ваша цитата «Мне нужна помощь, удаляющая объекты, чьи совпадение« Начало и конец »совпадают», но моя формулировка совершенно неверна ... черт возьми, на самом деле она должна была читать. Мне хотелось бы удалить объект, который начинается в начале и в конце матча с другими объектами в массиве. поэтому, другими словами, каждый объект массива сравнивается друг с другом, поэтому в конце у вас есть массив объектов с уникальными объектами startyear finishyear в массиве. Я очень надеюсь, что это имеет смысл. –