web-dev-qa-db-ger.com

Rufen Sie den Index des Objekts im Array ab, um das entsprechende Objekt in einem anderen Array nachzuschlagen

Ich habe zwei Arrays. Einer ist ein Array von Namen und der andere ist ein Array, bestehend aus Strings mit dem Namen "Yes" oder "No". Der Indexpfad jedes Namens im Array "name" entspricht dem gleichen Indexpfad im Array "Yes/No". Zum Beispiel:

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

Was wäre der einfachste Weg, um den Namen einer Person nachzuschlagen (möglicherweise den Indexpfad davon zu ermitteln) und zu überprüfen, ob sie im Feld "Ja/Nein" "Ja" oder "Nein" sind?

Ich bin mir auch nicht sicher, ob "Indexpfad" der richtige Begriff ist. Wenn dies nicht der Fall ist, meine ich die Nummer, die ein Objekt in einem Array befindet.

19
Preston

NSArray hat eine Methode namens indexOfObject, die entweder den niedrigsten Index zurückgibt, dessen entsprechender Array-Wert einemObject entspricht, oder NSNotFound, wenn kein solches Objekt gefunden wird. Wenn Ihr Array von Namen nicht sortiert ist, verwenden Sie dies, um den Index zu erhalten, den Sie dann in das Ja/Nein-Array einfügen können. Das ist etwas in diese Richtung:

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

Weil Bavarious Fragen stellt, bei denen ich davon ausgehe, dass dies der bessere Weg ist, wenn das Array von Namen alphabetisch sortiert wird.

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

wobei die Funktion findName eine einfache binäre Suche ist:

-(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

Der Versuch, zwei Arrays synchron zu halten, erfordert nur Probleme. Dies ist natürlich möglich, aber wenn Sie ein Array ändern, müssen Sie daran denken, eine entsprechende Änderung am anderen Array vorzunehmen. Tun Sie sich selbst einen Gefallen und vermeiden Sie diese ganze Klasse von Fehlern, indem Sie die Art und Weise, wie Sie Daten speichern, überdenken.

In diesem Fall haben Sie ein {person, boolean} -Paar. Eine Option ist, jedes Paar als Wörterbuch zu speichern und dann ein Array dieser Wörterbücher zu behalten. Dies wäre ein besonders guter Plan, wenn Sie die Anzahl der Datenstücke über die beiden vorhandenen hinaus erweitern könnten. Eine andere Option wäre, einfach ein Wörterbuch zu verwenden, in dem Schlüssel Personennamen und die Werte Ihre Ja/Nein-Werte sind. Dies macht die Antwort auf Ihre Frage sehr einfach:

NSString *yesOrNo = [personDictionary objectForKey:personName];

Um zu Ihrer ursprünglichen Frage zurückzukehren, wo Sie immer noch die beiden Arrays haben, besteht die Aufgabe am einfachsten darin, das Personenarray so lange zu durchlaufen, bis Sie die gewünschte Person gefunden haben und den Index dieses Namens erhalten und suchen Sie dann den entsprechenden Wert im Ja/Nein-Array:

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

Das ist in Ordnung, wenn die Anzahl der Personen in der Liste nicht zu groß ist. Wenn die Liste groß sein könnte, sollten Sie das person Array so sortieren, dass Sie eine binäre Suche durchführen können. Das Problem dabei ist jedoch, dass Sie das Ja/Nein-Array getrennt haben. Daher wird das Sortieren des personArray unter Beibehaltung des Ja/Nein-Arrays in der richtigen Reihenfolge kompliziert.

9
Caleb

Sie können auch unten den Code verwenden, Mai ist es nützlich für Sie,

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_

Sie können die indexOfObject-Methode verwenden, um den Index des Elements abzurufen.

zum Beispiel

Dadurch erhalten Sie einen Index Ihres Objekts

  NSInteger index = [yourArray indexOfObject:objectName];

Das entsprechende Element aus einem anderen Array sehen

[anotherArray objectAtIndex:index];

Das hat für mich funktioniert. Hoffe das hilft.

0
Pradumna Patil