2013-08-25 2 views
1

У меня есть массив чисел. Мне нужно сравнить каждое число в массиве с любым другим числом в массиве без какого-либо дублирования наборов сравнения. Например, нужно сравнивать объекты с индексом 0 и 1, но не нужно удваивать их позже, проверяя объекты с индексом 1 и 0.Проверить на каждую уникальную пару объектов в NSArray

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

+0

Если вы скажете, почему, вы даже можете получить лучшее решение. – Abizern

ответ

5

Я не знаю, что вам нужно сделать, это для, как есть, вероятно, более эффективные способы для достижения все, что вы пытаетесь сделать, но для случая, о котором Вы говорите, вы могли бы сделать простой:

for (int n=0;n<[array count];n++) { 
    for (int m=n+1;m<[array count];m++) { 
     //check your array based on objects at index n and m; 
    } 
} 

Это просто проходит через массив от начала до конца и для каждого объекта проходит через каждый объект после него, и вы можете сравнивать их или делать что угодно. Запуск внутреннего цикла в n+1 вместо 0 предотвращает повторение сравнений.

+0

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

+0

Первый цикл может идти один меньше, и я почти добавил «-1», но для простоты почти нет потерь производительности при этом, как и в последней итерации внешнего цикла, внутренний цикл будет немедленно удален. – Jsdodgers

+0

Да, я согласен с тем, что разница в большинстве случаев незначительна. –

0

Вы можете выполнять итерацию по массиву и при каждом числе сравнивать его со следующими числами только в массиве. , если у вас есть массив размером 5, то при arr [2] сравните его с arr [3], arr [4].

код psudo:

NSArray *arr; 
for(int i = 0; i < arr.count ; i++) 
{ 
    NSNumber *num1 = [arr objectAtIndex:i]; 
    for(int j = i + 1; j < arr.count; j++) 
    { 
     NSNumber *num2 = [arr objectAtIndex:j]; 
     //compare here num1 with num2 
    } 
} 
+0

Непонятно, почему это было пропущено, поскольку оно по сути то же самое, что и Jsdodgers. –

+0

Да, я не знаю, я был впечатлен, и я много раз пересматривал свой ответ, чтобы узнать, почему они проголосовали за меня !!! –

2

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

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