Sortierung ignoriert Interpunktion (Objective-C)

8

Ich versuche ein iOS UITableView-Objekt zu sortieren. Ich verwende derzeit den folgenden Code:

%Vor%

Damit wird meine Liste sortiert, ohne den Fall zu ignorieren. Es wäre jedoch auch gut, die Interpunktion zu ignorieren. Zum Beispiel:

%Vor%

sollte wie folgt sortiert sein:

%Vor%

(Es spielt eigentlich keine Rolle, welche der beiden Katzen (cat oder c.a.t.) zuerst kommt, solange sie nebeneinander sortiert sind).

Gibt es eine einfache Methode, um das zu umgehen? Ich nehme an, die Lösung würde beinhalten, nur die alphanumerischen Zeichen aus den Strings zu extrahieren, dann diese zu vergleichen und sie dann in ihre früheren Zustände zurückzubringen, wobei die nicht-alphanumerischen Zeichen wieder eingefügt werden.

Tatsächlich sind die einzigen Zeichen, die mir wirklich wichtig sind, Punkte (.), aber wenn es eine Lösung gibt, die alle Interpunktionszeichen leicht abdeckt, dann wäre es nützlich zu wissen.

Hinweis: Ich habe vor einem Monat diese genau dieselbe Frage zu Java gestellt. Jetzt erstelle ich dieselbe Lösung in Objective-C. Ich frage mich, ob es Tricks für die iOS-API gibt, die das einfach machen ...

Bearbeiten : Ich habe versucht, den folgenden Code zu verwenden, um Interpunktion zu entfernen und ein anderes Array zu füllen, das ich sortiere (vorgeschlagen von @tiguero). Ich weiß jedoch nicht, wie ich den letzten Schritt machen soll: das erste Array nach der Reihenfolge des zweiten zu sortieren. Hier ist mein Code:

%Vor%

Dies liefert 'arrayWithoutPunctuation', das sortiert ist, aber natürlich enthält die Interpunktion nicht . Das ist nicht gut, da es zwar gut sortiert ist, aber keine Interpunktion mehr enthält, die für das Array von entscheidender Bedeutung ist. Was ich tun muss, ist 'ArrayWithPunctuation' nach der Reihenfolge von 'ArrayWithoutPunctuation' zu sortieren ... Jede Hilfe wird geschätzt.

    
CaptainProg 24.10.2012, 21:53
quelle

3 Antworten

9

Sie können einen Vergleichsblock für NSArray verwenden und Ihr Code sieht wie folgt aus:

%Vor%

Dies ist möglicherweise nicht der effizienteste Code. Eine andere Option wäre, zuerst auf Ihrem Array zu iterieren und alle unerwünschten Zeichen zu entfernen und ein selector mit der Methode caseInsensitiveCompare zu verwenden:

%Vor%     
tiguero 24.10.2012, 22:41
quelle
2

Dies ist ein bisschen sauberer und ein bisschen effizienter:

%Vor%

Für echte Effizienz, würde ich eine Vergleichsmethode schreiben, die Interpunktion ignoriert, so dass keine Speicherzuweisungen benötigt würden, nur um zu vergleichen.

    
Moshe Gottlieb 06.11.2012 10:39
quelle
1

Meine Lösung wäre, jede Zeichenfolge in einem benutzerdefinierten Objekt mit zwei Eigenschaften

zu gruppieren
  • die ursprüngliche Zeichenfolge
  • die Zeichenfolge ohne Satzzeichen

... und sortieren Sie dann die Objekte basierend auf der Zeichenfolge ohne Interpunktion.

Objective C hat einige praktische Möglichkeiten, dies zu tun. Nehmen wir an, wir haben zwei Strings in diesem Objekt:

%Vor%

Fügen Sie zuerst Ihre benutzerdefinierten Objekte zu einem Array hinzu

%Vor%

Sortieren Sie das Array anschließend mit dem handlichen NSSortDescriptor nach der modifizierten -Variablen.

%Vor%

Voilà! Ihre Objekte (und Zeichenfolgen) sind sortiert. Weitere Informationen zu NSSortDescriptor ...

    
Eitan 30.10.2012 23:37
quelle

Tags und Links