it-swarm.com.ru

Получить индекс объекта в массиве для поиска соответствующего объекта в другом массиве

У меня есть два массива. Один - это массив имен, а другой - массив, состоящий из строк с названиями «Да» или «Нет». Путь индекса каждого имени в массиве «имя» соответствует тому же пути индекса в массиве «Да/Нет». Например:

Names Array | Yes/No Array
Person 1    | Yes
Person 2    | No
Person 3    | Yes

Какой самый простой способ найти имя человека (возможно, получить его путь индекса) и проверить, являются ли они «Да» или «Нет» в массиве «Да/Нет»?

Кроме того, я не уверен, правильно ли использовать термин «путь индекса». Если это не так, я имею в виду номер объекта в массиве.

19
Preston

У NSArray есть метод с именем indexOfObject, который будет возвращать либо самый низкий индекс, соответствующее значение массива которого равно anObject, либо NSNotFound, если такой объект не найден. Если ваш массив имен не отсортирован, используйте его, чтобы получить индекс, который вы можете подключить к массиву Да/Нет. То есть что-то вроде этого:

NSString *answer = nil;
NSUInteger index = [namesArray indexOfObject:@"John Smith"];
if (index != NSNotFound) {
    answer = [yesNoArray objectAtIndex:index];
}
return answer;

Поскольку Бавариус задает вопросы, где я предполагаю, вот лучший способ, когда массив имен сортируется в алфавитном порядке.

int index = [self findName:@"John Smith"];
NSString *answer = nil;
if (index >= 0) {
    answer = [yesNoArray objectAtIndex:index];
}
return answer;

где функция findName - это простой бинарный поиск:

-(int)findName:(NSString *)name {
    int min, mid, max;
    NSComparisonResult comparisonResult;
    min = 0;
    max = [namesArray count]-1;
    while (min <= max) {
        mid = min + (max-min)/2;
        comparisonResult = [name compare:[namesArray objectAtIndex:mid]];
        if (comparisonResult == NSOrderedSame) {
            return mid;
        } else if (comparisonResult == NSOrderedDescending) {
            min = mid+1;
        } else {
            max = mid-1;
        }
    }   
    return -1;  
}
31
PengOne

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

В этом случае у вас есть пара {person, boolean}. Один из вариантов - сохранить каждую пару в качестве словаря, а затем сохранить массив этих словарей. Это был бы особенно хороший план, если бы вы могли расширить количество фрагментов данных помимо тех двух, которые у вас есть. Другой вариант - просто использовать словарь, где ключи - это имена людей, а значения - ваши значения да/нет. Это делает ответ на ваш вопрос очень простым:

NSString *yesOrNo = [personDictionary objectForKey:personName];

Возвращаясь к исходному вопросу, в котором у вас все еще есть два массива, проще всего выполнить итерацию по массиву person до тех пор, пока вы не найдете нужного человека, не получите индекс этого имени и затем найдите соответствующее значение в массиве yes/no:

for (person in peopleArray) {
    if ([person isEqualToString:thePersonYoureLookingFor]) {
        yesNoValue = [yesNoArray objectAtIndex:[peopleArray indexOfObject:person];
        break;
    }
}

Это хорошо, если число людей в списке не слишком велико. Если список может быть большим, тогда вы захотите сохранить отсортированный массив, чтобы вы могли выполнять бинарный поиск. Но проблема в том, что массив yes/no является отдельным, поэтому сортировка personArray с сохранением массива yes/no в правильном порядке становится сложной.

9
Caleb

Вы также можете использовать ниже код, может быть полезным для вас,

NSSortDescriptor *_lastDescriptor = [[NSSortDescriptor alloc] initWithKey:@"" ascending:YES];
NSArray *_lastArray = [NSArray arrayWithObject:_lastDescriptor];


firstCharacterArray = (NSMutableArray *)[[nameIndexesDictionary allKeys]      
sortedArrayUsingDescriptors:_lastArray];
//firstCharacterArray = (NSMutableArray *)[[nameIndexesDictionary allKeys]                    
sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

for (NSString *eachlastIndex in firstCharacterArray)
{
NSSortDescriptor *lastDescriptor = [[NSSortDescriptor alloc] initWithKey:@""
                                                               ascending:YES];
//selector:@selector(localizedCaseInsensitiveCompare:)] ;
NSArray *descriptorslast = [NSArray arrayWithObject:lastDescriptor];
[[nameIndexesDictionary objectForKey:eachlastIndex]     
sortUsingDescriptors:descriptorslast];
[lastDescriptor release];
}
2
Dinesh_

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

например

Это даст вам индекс вашего объекта

  NSInteger index = [yourArray indexOfObject:objectName];

Чтобы увидеть соответствующий элемент из другого массива

[anotherArray objectAtIndex:index];

Это сработало для меня. Надеюсь это поможет.

0
Pradumna Patil