Wieiele verschiedene Werte in Array?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Wieiele verschiedene Werte in Array?

    Hi,

    erstmal danke für dieses Forum! Beschäftige mich erst seit kurzem mit der iPhone Programmierung und diese Seite hat mir schon oft weitergeholfen, aber nun stehe ich vor einem Problem das ich einfach nicht gelöst bekomme! Ich hoffe ihr könnt mir dabei weiterhelfen!

    Ich habe ein Array (endtime) mit verschiedenen Datumsangaben wovon sich viele wiederholen. Ich möchte nun herausfinden wieviele verschiedene Daten ich in dem Array gespeichert habe.

    Das Array hat folgenden Inhalt:

    2012-04-15
    2012-04-16
    2012-04-17
    2012-04-15
    2012-04-15
    2012-04-16
    2012-04-19

    So nun versuche ich über den folgenden Code herauszufinden wieviele verschiedene Daten enthalten sind.

    Quellcode

    1. NSMutableArray *arr = [NSMutableArray arrayWithObjects:nil];
    2. NSString *temp = @"";
    3. int tempInt = 0;
    4. [arr addObject:[self.endtime objectAtIndex:0]];
    5. for (int i=0; i<[self.endtime count]; i++) {
    6. tempInt=0;
    7. temp = [self.endtime objectAtIndex:i];
    8. for (int j = 0; j<[arr count]; j++) {
    9. if (temp==[arr objectAtIndex:j]) {
    10. tempInt=1;
    11. }
    12. }
    13. if (tempInt==0) {
    14. [arr addObject:temp];
    15. }
    16. NSLog(@"%i",tempInt);
    17. }
    Alles anzeigen


    Der Code gibt mir jetzt aus, dass ich 7 verschiedene Daten hab, obwohl es ja nur 4 verschieden sind. Könnt ihr mir sagen wodran das liegt? Habe ich nen logischen Fehler in dem Schleifenkonstrukt, oder liegt es an etwas anderem?

    Vielen Dank schonmal!
  • Ich möchte nun herausfinden wieviele verschiedene Daten ich in dem Array gespeichert habe


    Das geht mir zwei Zeilen:

    Quellcode

    1. NSMutableArray *keys = [NSMutableArray array];
    2. [keys addObject:@"2012-04-15"];
    3. [keys addObject:@"2012-04-16"];
    4. [keys addObject:@"2012-04-17"];
    5. [keys addObject:@"2012-04-15"];
    6. [keys addObject:@"2012-04-15"];
    7. [keys addObject:@"2012-04-16"];
    8. [keys addObject:@"2012-04-19"];
    9. // hier geht es los
    10. NSDictionary *dict = [NSDictionary dictionaryWithObjects:keys
    11. forKeys:keys];
    12. NSUInteger count = [dict count];
    13. NSLog(@"%lu", count);
    Alles anzeigen


    Viele Grüße
  • Eine frage habe ich noch...

    Ich wollte die Anzahl der verschiedenen Daten herausfinden um bestimmen zu können wieviele Sections ich in einer TableView darstellen möchte (Ein Datum ist eine Section).

    Wenn ich nun die "numberOfRowsInSection" bestimmen möchte, wäre es ja auch super zu wissen wieviele Daten ich eines Typs habe. also wie oft 2012-04-17 vorkommt. Gibt es da eine Möglichkeit das auch noch einfach herauszufinden?
  • Auch wenn hier schönere, elegantere, cocoarige Lösungen angegeben worden. Deine Ursprungslösung ist im Prinzip schon korrekt, nur verwendet du leider den verkehrten Vergleich. Mit

    Quellcode

    1. temp==[arr objectAtIndex:j]
    vergleichst du ob die Referenzen gleich sind, d.h. ob beide Ausdrücke auf das gleiche Objekt zeigen. Was du haben möchtest, ist ein Vergleich ob der Inhalt der beiden Stringobjekte gleich ist, und das macht man mit isEqualToString:, eine korrekte Variante könnte entsprechend lauten:

    Quellcode

    1. if ([temp isEqualToString:[arr objectAtIndex:j]]) {...


    KG
  • little_pixel schrieb:

    Das geht mir zwei Zeilen:

    Quellcode

    1. NSMutableArray *keys = [NSMutableArray array];
    2. [keys addObject:@"2012-04-15"];
    3. [keys addObject:@"2012-04-16"];
    4. [keys addObject:@"2012-04-17"];
    5. [keys addObject:@"2012-04-15"];
    6. [keys addObject:@"2012-04-15"];
    7. [keys addObject:@"2012-04-16"];
    8. [keys addObject:@"2012-04-19"];
    9. // hier geht es los
    10. NSDictionary *dict = [NSDictionary dictionaryWithObjects:keys
    11. forKeys:keys];
    12. NSUInteger count = [dict count];
    13. NSLog(@"%lu", count);
    Alles anzeigen


    Viele Grüße
    nicht ganz richtig, [dict count] gibt die gesamte Anzahl der enthaltenen Elemente zurück. Würde also im Beispiel 7 ausgeben, obwohl nur 5 unterschiedliche Werte vorhanden sind.
  • Kismet schrieb:

    little_pixel schrieb:

    Das geht mir zwei Zeilen:

    Quellcode

    1. NSMutableArray *keys = [NSMutableArray array];
    2. [keys addObject:@"2012-04-15"];
    3. [keys addObject:@"2012-04-16"];
    4. [keys addObject:@"2012-04-17"];
    5. [keys addObject:@"2012-04-15"];
    6. [keys addObject:@"2012-04-15"];
    7. [keys addObject:@"2012-04-16"];
    8. [keys addObject:@"2012-04-19"];
    9. // hier geht es los
    10. NSDictionary *dict = [NSDictionary dictionaryWithObjects:keys
    11. forKeys:keys];
    12. NSUInteger count = [dict count];
    13. NSLog(@"%lu", count);
    Alles anzeigen


    Viele Grüße
    nicht ganz richtig, [dict count] gibt die gesamte Anzahl der enthaltenen Elemente zurück. Würde also im Beispiel 7 ausgeben, obwohl nur 5 unterschiedliche Werte vorhanden sind.


    nein, denn die keys müssen unique sein!
    aber dafür ein dict zu verwenden ist overhead. es gibt ja (NS)set
  • Kismet schrieb:

    nicht ganz richtig, [dict count] gibt die gesamte Anzahl der enthaltenen Elemente zurück. Würde also im Beispiel 7 ausgeben, obwohl nur 5 unterschiedliche Werte vorhanden sind.

    Nein, DAS ist nicht richtig. Jeder Schlüssel kann in einem Dictionary nur einmal vorhanden sein. Der Code ist richtig, auch wenn die Lösung von MyMattes noch etwas eleganter ist.
    „Meine Komplikation hatte eine Komplikation.“
  • Vielen Dank erstmal für die vielen Antworten!

    Also die Lösung von little_pixel mit dem Dictionary funktioniert auf jeden fall... Werde aber heute Abend nach Feierabend mal das NSSet ausprobieren wenn es die elegantere Lösung ist.

    Stehe aber auch noch immer vor dem Problem, die "numberOfRowsInSection" zu bestimmen. Geritsch hat mir dazu ja den Hinweis mit dem NSCountedSet gegeben, kam damit aber irgendwie nicht klar. Kann mir dazu vielleicht noch jemand etwas konkreteres sagen? Ich brauche halt pro Datum eine Row in der Section.

    Vielen Dank schonmal!
  • Tocco schrieb:

    Stehe aber auch noch immer vor dem Problem, die "numberOfRowsInSection" zu bestimmen. Geritsch hat mir dazu ja den Hinweis mit dem NSCountedSet gegeben, kam damit aber irgendwie nicht klar. Kann mir dazu vielleicht noch jemand etwas konkreteres sagen? Ich brauche halt pro Datum eine Row in der Section.


    Das ist jetzt nicht Dein Ernst, oder ?

    developer.apple.com/library/ma…/Reference/Reference.html

    Es dauert 1min sich das durchzulesen und zu verstehen

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • macmoonshine schrieb:

    Kismet schrieb:

    nicht ganz richtig, [dict count] gibt die gesamte Anzahl der enthaltenen Elemente zurück. Würde also im Beispiel 7 ausgeben, obwohl nur 5 unterschiedliche Werte vorhanden sind.

    Nein, DAS ist nicht richtig. Jeder Schlüssel kann in einem Dictionary nur einmal vorhanden sein. Der Code ist richtig, auch wenn die Lösung von MyMattes noch etwas eleganter ist.

    Wie geil ist das denn. Hatte ich gar nicht gewusst das, dass NSDictionary automatisch doppelte Keys entfernt. Mir war eigentlich so das dann ne Exception geworfen wird - gut zu wissen aber nicht einsetzbar.
  • Hallo nochmal,

    nochmals Vielen Dank für die ganzen Antworten bis jetzt! Allerdings stehe ich nun wieder vor einem Problem mit meinem TableView... Ich hoffe dabei kann mir auch nochmal geholfen werden.

    Also ich habe es jetzt hinbekommen, dass ich aus meinen verschiedenen Datumsangaben Sections in der TableView erzeuge und auch jeder Section die richtige Anzahl an "Rows" inkl. Beschriftung zuweise. Nun stehe ich aber vor dem Problem, dass wenn man auf diese Row klickt, der DetailView die richtigen Daten anzeigt.

    Folgendes Szenario spielt sich hier ab.

    Die App bekommt Daten als JSON String von einem PHP Script geliefert. Der JSON String sieht so aus:

    [{"id":"1","Datum":"2012-04-15","TNameA":"Köln","TNameB":"Bonn","EventName":"TakeOff"},...]

    Diese Werte speichere ich in Arrays ab.

    Um in meiner TableView die Sections zu ermitteln, erzeuge ich aus den Datumsangaben ein Dictionary und gebe den count Wert des Dictionarys zurück.

    Die numberOfRowsInSection ermittel ich über ein NSCountedSet (danke nochmals für den Hinweis: gritsch)

    In der Methode cellForRowAtIndexPath konfiguriere ich die cell mit folgendem Code:

    Quellcode

    1. NSDictionary *dict = [NSDictionary dictionaryWithObjects:self.endtime forKeys:self.endtime];
    2. NSArray *keys = [dict allKeys];
    3. int x = 0;
    4. for (int i = 0; i<[self.endtime count]; i++) {
    5. if (i==0) {
    6. x=0;
    7. }
    8. self.temp2 = [NSString stringWithFormat:@"%@%@",[self.TNameA objectAtIndex:i],[self.TNameB objectAtIndex:i]];
    9. if ([[self.endtime objectAtIndex:i] isEqualToString:[keys objectAtIndex:indexPath.section]] && x==0) {
    10. if (![self.temp isEqualToString:self.temp2]) {
    11. x = 1;
    12. self.temp = [NSString stringWithFormat:@"%@%@",[self.TNameA objectAtIndex:i],[self.TNameA objectAtIndex:i]];
    13. NSString *ausgabe = [NSString stringWithFormat:@"%@ und %@", [self.TNameA objectAtIndex:i], [self.TNameB objectAtIndex:i]];
    14. cell.textLabel.text = ausgabe;
    15. }
    16. }
    17. }
    18. return cell;
    Alles anzeigen


    Nun mein Problem... Ich weiß nicht wie ich in der Methode didSelectRowAtIndexPath sagen soll welche Infos im DetailView angezeigt werden sollen.

    Meine Überlegung war, dass ich in dem angegeben Code ein Mehrdimensionales Array erstelle in dem ich die ID, TNameA, TNameB abspeichere in der Rheienfolge wie die Daten in der TableView angezeigt werden. Das Array sollte so aussehen:

    Quellcode

    1. <Array>
    2. <Section>
    3. <Array>
    4. <Row>
    5. <Array>
    6. <ID>
    7. <TNameA>
    8. <TNameB>
    9. </Array>
    10. </Array>
    11. </Array>
    Alles anzeigen


    Mit diesem Array wollte ich dann auslesen welche Infos für die Row auf die geklickt wurde nötig sind um die Daten an den DetailView zu übergeben, damit dieser sich nähere Infos vom Server holen kann.

    Mit diesem Befehl wollte ich die Daten dann auslesen um diese dann übergeben zu können:

    Quellcode

    1. [[[self.data objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] objectAtIndex:0];


    Ich glaube der Befehl zum auslesen ist richtig, aber ich habe gestern Stunden damit verbracht ein mehrdimensionales Array zu erzeugen was dann acuh die richtigen Daten an den richtigen Stellen beinhaltet. Leider ohne Erfolg. Ich hoffe, dass mir jemand von euch helfen kann, denn sonst verzweifle ich hier noch ;)

    Viele Grüße
    Tocco
  • Kismet schrieb:


    Wie geil ist das denn. Hatte ich gar nicht gewusst das, dass NSDictionary automatisch doppelte Keys entfernt. Mir war eigentlich so das dann ne Exception geworfen wird - gut zu wissen aber nicht einsetzbar.


    Dann müsste man zum überschreiben des Wertes eines Keys ja jedesmal erst den alten Wert löschen, ist so doch etwas bequemer.


    Wenn du selbst einen Setter schreibst, wirst du für den Fall, dass der alte Wert nicht nil ist ja auch keinen Crash fabrizieren. ;)
  • Naja sagen wir mal wir haben 15 gleiche Keys, welcher key beziehungsweise welches Key-Value Paar wird dann ins Dictionary übernommen? Ich konnte da jetzt nichts finden daher glaube ich das dieser Zustand undefiniert ist, beziehungsweise eventuell das erste/nächste Element im Adressraum....

    Ich hab das jetzt nicht selber programmatisch Nachvollzogen was da rauskommt aber ich halte das nicht für sauber, man sollte bei key-duplikaten generell ne Exception werfen. In der AppleDoku habe cih auch nichts aussagekräftiges gefunden. Ich für meinen Teil werden weiterhin immer brav Prüfen... ;)
  • Kismet schrieb:

    Naja sagen wir mal wir haben 15 gleiche Keys, welcher key beziehungsweise welches Key-Value Paar wird dann ins Dictionary übernommen? Ich konnte da jetzt nichts finden daher glaube ich das dieser Zustand undefiniert ist, beziehungsweise eventuell das erste/nächste Element im Adressraum....

    Das letzte Key-Value Paar, welches Du hinzugefügt hast.

    Kismet schrieb:

    In der AppleDoku habe cih auch nichts aussagekräftiges gefunden.

    Ist das hier nicht aussagekräftig genug?
    If aKey already exists in the dictionary, the dictionary’s previous value object for that key is sent a release message and anObject takes its place.

    Michael