Index suchen in einem NSArray mit vielen NSObjects (keine NSDictionaries)

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

  • Da Key-Value Coding bei properties geschenkt dazu kommt kann man das so machen:


    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"uniqueNumber == %@", @"42"];
    NSArray *result = [yourNSArray filterUsingPredicate:predicate];

    Kürzer und pregnanter geht es wohl nicht... Keine Enumeration nix direkt das Ergebnis und man kann im Predicatestring noch wesentlich komplexere Queries machen!
  • ck1911 schrieb:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"uniqueNumber == %@", @"42"];
    NSArray *result = [yourNSArray filterUsingPredicate:predicate];

    Kürzer und pregnanter geht es wohl nicht... Keine Enumeration nix direkt das Ergebnis und man kann im Predicatestring noch wesentlich komplexere Queries machen!

    So so, du meinst also die Methode filteredArrayUsingPredicate: kommt ohne Enumeration aus? ;)
  • Michael schrieb:

    ck1911 schrieb:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"uniqueNumber == %@", @"42"];
    NSArray *result = [yourNSArray filterUsingPredicate:predicate];

    Kürzer und pregnanter geht es wohl nicht... Keine Enumeration nix direkt das Ergebnis und man kann im Predicatestring noch wesentlich komplexere Queries machen!

    So so, du meinst also die Methode filteredArrayUsingPredicate: kommt ohne Enumeration aus? ;)


    So so wird heute programmiert. Man nimmt einfach eine möglichst komplexe Funktion und fertig. Man macht sich keine Gedanken darüber wie so eine Funktion wohl abgebildet sein könnte und wie performant sowas ist.

    Gruss

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Wenn es rein um Geschwindigkeit geht, lege einfach ein 1D-Array an mit deine Indexes an. Du musst dann nur darauf achten das, das Hinzufügen und Entfernen von Objekten auch in deinem Index-Array berücksichtigt wird. Aber das ist meines Erachtens die schnellste Methode. NSPredicate und Co sind leider nur Lösungen die sehr Allgemein gehalten sind und daher für dein Problem eigentlich zu Mächtig.

    Ich würde für das Index-Array aber dann in reinem C realisieren und mir nicht den ganzen Overhead vom NSArray an tun.
  • Michael schrieb:

    ck1911 schrieb:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"uniqueNumber == %@", @"42"];
    NSArray *result = [yourNSArray filterUsingPredicate:predicate];

    Kürzer und pregnanter geht es wohl nicht... Keine Enumeration nix direkt das Ergebnis und man kann im Predicatestring noch wesentlich komplexere Queries machen!

    So so, du meinst also die Methode filteredArrayUsingPredicate: kommt ohne Enumeration aus? ;)


    So war das nicht gemeint!
    Wie Apple die Funktion implmentiert hat weiss doch von uns eh keiner!? Ansonsten bestünde ja noch die Möglichkeit ein sortiertes Array mit binär Zugriff nach ID zu wählen. Aber da ist unter Umständen der Sort teuerer als zu iterieren (kommt halt auf die Größe an).

    Gemeint war von mir aus nur, bevor ich explizit meine eigene Loop mit Enumeration mache und habe mehr als eine Bedingung nehme ich eben ein NSPredicate ;)

    Oder man macht eine verkettete Liste und diese ebenfalls sortiert, habe da auf GitHub schon mal was fertiges gesehen. Man muss das Rad nicht immer neu erfinden
  • ck1911 schrieb:

    Gemeint war von mir aus nur, bevor ich explizit meine eigene Loop mit Enumeration mache und habe mehr als eine Bedingung nehme ich eben ein NSPredicate

    Mit der Methode indexOfObjectPassingTest: brauchst Du auch keine eigene Loop. Und du die Suche nach dem Index wird abgebrochen, sobald du fündig geworden bist.

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