vergleicht Arrays in objective-c

9

Ok, eine ziemlich einfache Frage ... in C ++ scheint es zu funktionieren, aber in objective-c scheint ich damit zu kämpfen: S .. Wenn Sie zwei Arrays vergleichen wollen, sollte es so etwas wie rechts

sein %Vor%

Was ist das Problem genau?

    
hakre 16.07.2009, 14:05
quelle

5 Antworten

36

Hierbei handelt es sich um Cocoa-Array-Objekte (Instanzen von NSArray), nicht um C-Arrays oder C ++ - Vektoren. Denken Sie daran, dass Objective-C nicht überladen wird. Die einzigen Dinge, die Sie mit einem Objekt tun können, sind das Weitergeben, das Speichern in Variablen und das Senden von Nachrichten an das Objekt.

Also ist der Array-Subscript-Operator bei Objective-C-Objekten falsch. Ich glaube nicht, dass es sogar sprachlich gültig ist, einen Zeiger auf ein Objective-C-Objekt zu dereferenzieren, daher sollte Ihnen dieser Code einen Compilerfehler geben. Ich kann mich allerdings geirrt haben. Wenn es zur Laufzeit kommt, stürzt dieser Code früher oder später ab, da Sie auf Speicher jenseits der Enden der Array-Objekte zugreifen.

(EDIT aus dem Jahr 2013: Objective-C unterstützt jetzt das Subskribieren von Objekten. Dies führt letztendlich zu der entsprechenden Nachricht objectAtIndex: oder replaceObjectAtIndex:withObject: . Also würde der Code in der Frage jetzt funktionieren, obwohl es immer noch nicht funktioniert der richtige Weg, einfach ein Array zu gehen, geschweige denn zwei Arrays zu vergleichen.)

Die richtige Methode zum Abrufen eines Objekts aus einem NSArray-Objekt durch seinen Index besteht nicht darin, den Array-Subscript-Operator zu verwenden, sondern zum Senden des Array-Objekts die Nachricht objectAtIndex: :

%Vor%

Der richtige Weg, um die Elemente eines Array-Objekts zu durchlaufen, vorausgesetzt, dass Sie den Index für etwas anderes nicht wirklich benötigen (z. B. das Ersetzen von Objekten in einem veränderbaren Array), ist es direkt zu loopen (dies wird " schnelle Aufzählung "):

%Vor%

NSArray reagiert auch auf objectEnumerator und reverseObjectEnumerator , die ein ähnlich iterierbares Objekt zurückgeben. Von den beiden ist reverseObjectEnumerator im neuen Code umso nützlicher, da Sie das Array einfach direkt durchlaufen können, um vorwärts zu iterieren. Beide waren am nützlichsten, bevor eine schnelle Aufzählung existierte; dieser Code sah so aus:

%Vor%

(Ja, das ist eine Aufgabe in der Bedingung. Absichtlich, daher die extra () . Wir haben damals mutig programmiert, oder?)

Für das, was Sie tun, möchten Sie wahrscheinlich eher eines der Arrays eine isEqualToArray: -Nachricht senden, wie Williham Totland vorgeschlagen hat:

%Vor%

Dies stellt sicher, dass beide Arrays die gleiche Länge haben, dann gehen Sie beide in lock-step und senden isEqual: an jedes Objektpaar. Es wird YES zurückgegeben, wenn jede isEqual: Nachricht zurückgegeben wurde YES ; NO ansonsten. Die Arrays können verschiedene Objekte enthalten, aber solange jedes Paar gleich ist, sind die Arrays selbst gleich.

Das setzt voraus, dass Sie die Objektgleichheit wünschen. Zwei separate Objekte sind gleich, wenn einer von ihnen mit YES antwortet, wenn Sie ihm eine isEqual: -Nachricht senden und das andere Objekt übergeben. Wenn Sie die Identitäten der Objekte vergleichen möchten, müssen Sie die Lock-Step-Schleife selbst durchführen und == verwenden:

%Vor%

Aber das ist unwahrscheinlich. Meistens wollte ich die Gleichheit der Objekte testen, nicht die Identitäten, also isEqualToArray: ist was ich wollte.

    
Peter Hosey 16.07.2009, 15:26
quelle
19

Sie möchten die Methode isEqualToArray: . Wie in:

%Vor%

Dies wird rekursiv die beiden Arrays vergleichen, während es den Vorteil hat, dass es nicht unnötig umständlich ist und keine Schleife benötigt.

    
Williham Totland 16.07.2009 14:10
quelle
1

Sagen Sie uns das Ergebnis, das Sie erhalten, wenn Sie diesen Code ausführen. Der Ansatz ist korrekt, aber versuchen Sie es:

%Vor%     
Dan Lorenc 16.07.2009 14:10
quelle
1

Hier ist eine kleine, die ich basierend auf dem Top-Ranking zusammengestellt habe. Dies überprüft lediglich, dass die Arrays die gleichen Werte enthalten, unabhängig von der Reihenfolge und ob es Dubletten gibt. Ich verwende das hauptsächlich, um Schlüssel von zwei Wörterbüchern zu vergleichen (die oft ihre allKeys-Arrays in verschiedenen Sortierreihenfolgen zurückgeben), um zu sehen, ob sie die gleichen Objekte enthalten. Danke Peter Hosley für die Bereitstellung des Beispiels, aus dem ich das übernommen habe.

%Vor%     
Alex Zavatone 11.02.2015 21:30
quelle
0

Ich mache Folgendes beim Vergleich von Arrays:

  • Überprüfen Sie, ob eines der Arrays null ist, wenn das andere nicht
  • ist
  • Überprüfen Sie, ob die Längen gleich sind
  • Iteriere (benutze eine for-Schleife wie du) über jedes Element und überprüfe das passende Element im anderen Array.

Um Elemente zu vergleichen, müssen Sie definieren, was Sie als "gleich" ansehen möchten. Sind sie nur dann gleich, wenn die Zeiger im Array gleich sind oder sie gleich sein können, wenn auch der Inhalt gleich ist.

Für den Zeigerfall können Sie ==.

verwenden

Für den tiefen Vergleich müssen Sie CompareTo oder etwas ähnliches verwenden.

    
rein 16.07.2009 14:11
quelle

Tags und Links