Cocoa lernen - Schritt für Schritt
Cocoa lernen - Schritt für Schritt
Lotto mit Dictionary

Statt eine Auflistung zu verwenden, die man mühevoll mit einer Schleife durchsuchen muss, wäre für diese Aufgabenstellung ein Objekt viel besser geeignet, das man direkt fragen kann, ob eine Zahl schon vorhanden ist. Ein Dictionary erfüllt genau diese Anforderungen und ermöglicht einen weitaus einfacheren und auch schnelleren Zugriff. An der grundlegende Funktionsweise der Anwendung ändert sich hingegen nicht viel. Weiterhin muss für jede ausgespielte Zufallszahl geprüft werden, ob sich diese schon in der Auflistung befindet. Allerdings sind dafür viel weniger Anweisungen nötig, wenn man ein Dictionary verwendet.
NSMutableDictionary *zufallsDictonary;
zufallsDictonary = [NSMutableDictionary dictionaryWithCapacity:
6];
Der Vergleich funktioniert ähnlich wie bei einem Array, allerdings entfällt die zweite Schleife. Durch objectForKey kann man direkt fragen, ob eine Zahl schon im Dictionary vorhanden ist. Ist das gesuchte Objekt nicht im Dictionary, gibt die Anfrage nil zurück und das Objekt darf hinzugefügt werden.
for (int a = 0; a < 6; a++)
{
    valid = false;

    // Solange Zufallszahlen erzeugen bis eine gültige, noch nicht
    // vorhandene Zahl ermittelt wurde.
    while (valid == false)
    {
        // Neue Zufallszahl erzeugen
        zufallszahl = [[NSNumber alloc] initWithInt:(random() %
49) +1];

        // Prüfen ob diese Zahl schon im Dictionary ist
        if([zufallsDictonary objectForKey:zufallszahl] == nil)
        {
            [zufallsDictonary setObject:zufallszahl forKey:zufallszahl];
            valid = true;
        }
        else
        {
            valid = false;
        }

        [zufallszahl release];
    }
}
Normalerweise verwendet ein NSMutableDictionary ein Wertepaar aus Key und Objekt. Es spricht aber nichts dagegen für beide Teile das selbe zu verwenden. In diesem Beispiel wird für Key und Objekt die Zufallszahl verwendet.

Leider lassen sich Dictionary nicht sortieren. Möchte man aber weiterhin eine sortierte Ausgabe, kann man mit ein Dictionary leicht in ein Array füllen und dieses stattdessen sortieren. Die Anweisung allKeys macht aus allen Keys der Dictionary ein Array.
// In ein Array übertragen
NSMutableArray *zufallsArray;
zufallsArray = [[NSMutableArray alloc] init];
[zufallsArray addObjectsFromArray: [zufallsDictonary allKeys] ];

// Mit Sort-Methode des Objekts
[zufallsArray sortUsingSelector:
@selector(compare:)];
Am Ende folgt, wie zuvor auch, die Ausgabe.
[zufall1 setStringValue:[zufallsArray objectAtIndex:0]];
[zufall2 setStringValue:[zufallsArray objectAtIndex:
1]];
[zufall3 setStringValue:[zufallsArray objectAtIndex:
2]];
[zufall4 setStringValue:[zufallsArray objectAtIndex:
3]];
[zufall5 setStringValue:[zufallsArray objectAtIndex:
4]];
[zufall6 setStringValue:[zufallsArray objectAtIndex:
5]];
[zufallsArray release];
Da das Array mit alloc und init erzeugt wurde, muss man es selbst mit release wieder freigeben. Das Dictionary wurde auf anderem Wege erzeuget, nämlich mit dictionaryWithCapacity. Dadurch landet es automatisch im AutoreleasePool und man muss sich nicht weiter darum kümmern.

nächste Seite