NSArray gruppieren

  • NSArray gruppieren

    Hi, iche mal wieder, mit ner kurzen Frage

    hab nen Array mit Objekten, nun will ich den Array gruppieren wo der Wert (Summe) eines der Objekte zB <= 100, <=200, <=300, <=400 ist

    muss ich dazu den Array 4x durchlaufen und diese Werte dann wieder in nen Array speichern oder geht das in einem Zug

    hier mal der Code dazu

    Quellcode

    1. - (NSArray *)groupUsersBySum:(NSArray *)users
    2. {
    3. NSMutableArray *groupedArray = [[NSMutableArray alloc] initWithCapacity:[users count]];
    4. // das dann 4mal ausführen?
    5. NSMutableArray *group100 = [[NSMutableArray alloc] init];
    6. for (NSDictionary *user in users) {
    7. if ([[user valueForKey:@"sum"] doubleValue] <= 100.00f) {
    8. [group100 addObject:user];
    9. }
    10. }//
    11. [groupedArray addObject:group100];
    12. return groupedArray;
    13. }
    Alles anzeigen


    EDIT: ok grad festgestellt, das geht so nicht, beim 2. Durchlauf bekomme ich ja die Werte aus dem 1. Durchlauf noch dazu weil <= 100 auch <= 200 ist ^^
    [window close]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von uniique ()

  • danke, das hat mir gut geholfen der Ansatz, habs jetzt so

    Quellcode

    1. - (NSArray *)groupUsersBySum:(NSArray *)users
    2. {
    3. self.groupedUsers = [[NSMutableArray alloc] initWithCapacity:[users count]];
    4. NSMutableArray *group100 = [[NSMutableArray alloc] init];
    5. NSMutableArray *group200 = [[NSMutableArray alloc] init];
    6. double distance;
    7. for (NSDictionary *user in users) {
    8. if ([[user valueForKey:@"sum"] doubleValue] <= 100.00f) {
    9. [group100 addObject:user];
    10. }
    11. if ([[user valueForKey:@"sum"] doubleValue] > 100.00f && [[user valueForKey:@"sum"] doubleValue] <= 200.00f) {
    12. [group200 addObject:user];
    13. }
    14. }
    15. [_groupedUsers addObject:group100];
    16. [_groupedUsers addObject:group200];
    17. return _groupedUsers;
    18. }
    Alles anzeigen
    [window close]
  • wie ich gerade noch sehe, ist wahrscheinlich die Rückgabe eines Array nicht so sinnvoll wenn man das ganze in einen UITableView packen will und die Header für die Section nicht fest setzten möchte, ich denke mal ein NSDictionary ist hier besser aufgehoben, weil es ja auch sein kann dass eine Gruppe nichts enthält und ich dann ja die Gruppe auch nicht anzeigen möchte als leere Section
    [window close]
  • also anstatt

    Quellcode

    1. if ([[user valueForKey:@"sum"] doubleValue] <= 100.00f) {
    2. [group100 addObject:user];
    3. }

    eher

    Quellcode

    1. if (tmpValue <= 100.00f) {
    2. [group100 addObject:user];
    3. }

    und vor den ganzen if Abfragen tmpValue setzen, weil es performanter ist nen Wert direkt zu vergleichen als dafür immer das NSDictionary abzufragen?
    [window close]
  • uniique schrieb:

    also anstatt

    Quellcode

    1. if ([[user valueForKey:@"sum"] doubleValue] <= 100.00f) {
    2. [group100 addObject:user];
    3. }

    eher

    Quellcode

    1. if (tmpValue <= 100.00f) {
    2. [group100 addObject:user];
    3. }

    und vor den ganzen if Abfragen tmpValue setzen, weil es performanter ist nen Wert direkt zu vergleichen als dafür immer das NSDictionary abzufragen?


    genau - sieht ja auch übersichtlicher aus. sonst muss man immer schauen ob wohl kein andere key verwendet wird oder plötzlich auf intValue statt double verglichen wird.
  • gritsch schrieb:

    uniique schrieb:

    also anstatt

    Quellcode

    1. if ([[user valueForKey:@"sum"] doubleValue] <= 100.00f) {
    2. [group100 addObject:user];
    3. }

    eher

    Quellcode

    1. if (tmpValue <= 100.00f) {
    2. [group100 addObject:user];
    3. }

    und vor den ganzen if Abfragen tmpValue setzen, weil es performanter ist nen Wert direkt zu vergleichen als dafür immer das NSDictionary abzufragen?


    genau - sieht ja auch übersichtlicher aus. sonst muss man immer schauen ob wohl kein andere key verwendet wird oder plötzlich auf intValue statt double verglichen wird.


    Also wenn der compiler das nicht selber optimiert mit dem Zwischenspeichern, dann ist das aber der mit Abstand schlechteste compiler der in den letten 10 Jahren benutzt wurde

    Nichts desto trotz wuerde ich es aber auch von Hand schreiben weil es einfach schöner aussieht. Aber für die Performance sollte es toal egal sein.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

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

    gritsch schrieb:

    uniique schrieb:

    also anstatt

    Quellcode

    1. if ([[user valueForKey:@"sum"] doubleValue] <= 100.00f) {
    2. [group100 addObject:user];
    3. }

    eher

    Quellcode

    1. if (tmpValue <= 100.00f) {
    2. [group100 addObject:user];
    3. }

    und vor den ganzen if Abfragen tmpValue setzen, weil es performanter ist nen Wert direkt zu vergleichen als dafür immer das NSDictionary abzufragen?


    genau - sieht ja auch übersichtlicher aus. sonst muss man immer schauen ob wohl kein andere key verwendet wird oder plötzlich auf intValue statt double verglichen wird.
    Also wenn der compiler das nicht selber optimiert mit dem Zwischenspielen, dann ist das aber der mit Abstand schlechteste compiler der in den letten 10 Jahren benutzt wurde

    Nichts desto trotz wuerde ich es aber auch von Hand schreiben weil es einfach schöner aussieht. Aber für die Performance sollte es toal egal sein.

    Gruß

    Claus


    meine augen/hirn sind kein compiler deswegen schreibe ich es so wie ich es am schnellsten überblicke ;)