Альтернатива решению Vin, которое, как я считаю, будет работать. Но это не создает результирующий массив. Он управляет существующим. Для этого он создает временные копии для управления итерациями.
NSArray workingCopy = [NSArray arrayWithArray:yourArray];
for (int i = 0; i < [workingCopy count] - 1; i++) { // count - 1 just saves time. Works nicely without.
for (int j = i+1; j < [workingCopy count]; j++) {
if ([[[workingCopy objectAtIndex:i] objectForKey:@"color"] isEqualToString: [[workingCopy objectAtIndex:j] objectForKey:@"color"]] {
[yourArray removeOjbect:[[workingCopy objectAtIndex:i] objectForKey:@"color"]] // yourArray must be mutable for this.
}
}
}
Этот алгоритм создает копию исходного массива раньше. Это делается для того, чтобы избежать скрещивания с изменениями в самом массиве, который используется для итераций/перечислений. Затем он выполняет итерацию, хотя копия в двумерном цикле, избегая сравнивать один и тот же объект с самим собой (i никогда не является подходящим для j), и он избегает сопоставления A с B, когда B уже сравнивается с A. Оба достигнуты путем указания j с i + 1. Самая последняя итерация будет i = [workingCopy count]
. Тогда j
начнется с i+1
и, следовательно, уже будет больше [workingCopy count]
. Тело цикла не будет выполняться за один раз. Вот почему петля i
уже может закончиться с [workingCopy count] - 1
.
То же самое можно сделать без копии исходного массива. Но это требует довольно умных манипуляций с запущенными idices i и j, что не является хорошим стилем программирования, довольно сложным и подверженным ошибкам.
Просто для ловли. Эти два блюза - это те же экземпляры одного и того же объекта или те разные экземпляры, которые имеют одинаковое значение? –
Оба являются разными объектами, которые имеют одинаковые значения, на самом деле легко удалить двуличие из простого массива, здесь я столкнулся с проблемой, потому что массив содержал словарь. –