Cocoa lernen - Schritt für Schritt
Cocoa lernen - Schritt für Schritt
Automatisches Sortieren

Ein Array mit Hilfe eines Bubble Sort ist eine aufwendige und vor allem unnötige Angelegenheit. Bubble Sort ist immer eine feine Sache, um Dinge in die richtige Reihenfolge zu bringen und jeder Programmierer sollte wissen wie es funktioniert. Für solch triviale Vorgänge aber wie Zahlen zu sortieren, gibt es Alternativen. Das kann das Cocoa-Framework nämlich selbst viel besser und Sie können den gesamten Code für die Sortierung durch eine einzige Programmzeile ersetzten.
[zufallsArray sortUsingSelector:@selector(compare:)];
Durch diese Anweisung wird die Array-eigene Sortiermethode aufgerufen, die in Windeseile die mühselige Arbeit des Sortierens für Sie erledigt.

Der Aufruf braucht einen selector, eine Methode, welche die Werte miteinander vergleicht und ein NSComparisonResult zurück gibt. In diesem Fall wollen Sie NSNumber vergleichen, und compare ist auch tatsächlich eine Methode, in der NSNumber-Klasse mit der man eine NSNumber mit einer anderen vergleichen kann. Der Rest geht dann schon automatisch.

Wenn Sie eigene Klassen schreiben, können Sie auch für diese eigene compare-Methoden implementieren. In dieser Methode bestimmen Sie dann, wie ein Objekt mit einem anderen Objekt gleichen Types verglichen wird und nach welchen Kriterien ein Objekt größer oder kleiner als ein anderes Objekt ist.

Leider ist NSNumber keine von Ihnen erstellte Klasse, eine weitere Methode für alternative Vergleiche können Sie also nicht so ohne weiteres hinzufügen. Wollen Sie das Array aber auf eine andere Weise sortieren, bietet sich sortUsingFunction an. Hier können Sie explizit eine Funktion angeben, die den Vergleich vornimmt.
[zufallsArray sortUsingFunction:myCompareFunction context:NULL];
Wie Sie diese Methode dann umsetzten, bleibt ganz Ihnen überlassen. Wichtig ist nur, dass Sie verschiedene NSComparisonResult als Rückgabewerte haben.
Folgender Code macht genau das, was sie bereits mit sortUsingSelector erreicht haben: er sortiert das Array aufsteigend. Tauschen Sie hingegen die beiden Werte NSOrderedAscending und NSOrderedDescending gegeneinander, so wird das Array absteigend sortiert.
int myCompareFunction(id val1, id val2, void *context)
{
    int nVal1 = [val1 intValue];
    int nVal2 = [val2 intValue];
    if(nVal1 < nVal2)
{
    return NSOrderedAscending ;
}
    else if(nVal1 > nVal2)
    {
        return NSOrderedDescending;
    }
    return NSOrderedSame;
}
Vergessen Sie nicht, dass Sie diese Methode auch in der Headerdatei definieren müssen.

Die Vergleichsmethode hat einen dritten Parameter, einen Context, der bisher nicht benutzt wurde. Mit dem Context können Sie zusätzliche Informationen in die Methode hineingeben und auf diese Art komplexe Vergleiche erstellen. Der Context kann dabei ein Zeiger auf ein beliebiges Objekt sein, ein NSString zum Beispiel, ist eine gute Möglichkeit den Context zu verwenden.
int myCompareFunction(id val1,id val2,void *context)
{
    int nVal1 = [val1 intValue];
    int nVal2 = [val2 intValue];

    NSString *order = context;

    if([order compare:@"auf"] == NSOrderedSame)
    {
        if(nVal1 < nVal2)
        {
            return NSOrderedAscending;
        }
            else if(nVal1 > nVal2)
        {
            return NSOrderedDescending;
        }
    }
    else
    {
        if(nVal1 < nVal2)
        {
            return NSOrderedDescending;
        }
            else if(nVal1 > nVal2)
        {
            return NSOrderedAscending;
        }
    }
    return NSOrderedSame;
}
Versuchen Sie jetzt mal folgende Anweisungen:
[zufallsArray sortUsingFunction:myCompareFunction context:@"auf"];
oder
[zufallsArray sortUsingFunction:myCompareFunction context:@"ab"];