NSArray sortieren - Zahlen und Sonderzeichen nach Buchstaben

  • Wenn Du das sections Array nutzt und Dir an Hand dessen ein sortiertes Array erstellen lässt, dann ändert das nichts am NSFetchedResultsController.
    Überhaupt überwacht das Teil nur die Änderungen am ManagedObjectContext.

    Wenn Du die Objekte bearbeitest, die sich beispielsweise im Sections Array befinden, dann änderst Du auch die Daten im NSManagedObjectContext.
    Da Du aber nur die Reihenfolge im Array ändern willst, bleibt der ManagedObjectContext davon völlig unbeeindruckt.

    Nach wie vor besteht aber weiterhin das Problem, dass sich die Strings nicht Deinen Vorstellungen entsprechend sortieren lassen wollen.
    Damit könnte Dir geholfen sein:

    Quellcode

    1. NSArray * words = @[@"Andrea", @"Hilde", @"Berta", @"99", @"2001", @"Nadine", @"3lise", @"Christina", @"Denise", @"Frida", @"@dda", @"#ier"];
    2. NSArray *theSortedStrings = [words sortedArrayUsingComparator:^(id obj1, id obj2) {
    3. NSString * inputString = (NSString*)obj1;
    4. NSString * comparerString = (NSString*)obj2;
    5. NSUInteger first_character = [inputString characterAtIndex:0];
    6. NSUInteger compare_start_character = [comparerString characterAtIndex:0];
    7. // Der erste String startet mit einer Zahl, der Zweite nicht.
    8. if(first_character < 'A' && compare_start_character > 'A') {
    9. return NSOrderedDescending;
    10. }
    11. // Der zweite String startet mit einer Zahl, der erste nicht.
    12. else if(first_character > 'A' && compare_start_character < 'A') {
    13. return NSOrderedAscending;
    14. }
    15. // Beides Zahlen oder beides Text. Das kann das System intern auch selbst regeln.
    16. else {
    17. return [inputString compare:comparerString options:NSCaseInsensitiveSearch|NSNumericSearch];
    18. }
    19. }];
    20. NSLog(@"Sorted: %@", theSortedStrings);
    Alles anzeigen

    Sorted: (
    Andrea,
    Berta,
    Christina,
    Denise,
    Frida,
    Hilde,
    Nadine,
    "#ier",
    3lise,
    99,
    2001,
    "@dda"
    )
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Andere Variante von Marco's Ansatz: In dem NSComparisonResult baust Du immer dann einen "sehr grossen" Unichar vor die zu vergleichende Zeichenkette, wenn deren erstes Zeichen keinen Buchstaben darstellt. Dann wird normal verglichen. Somit landen alle Nicht-Buchstaben hinten, ohne dass Du eigene Sortierungen schreiben musst.

    Das sieht dann in etwa so aus (ohne Prüfungen etc.):

    Quellcode

    1. ... = [tempArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
    2. {
    3. NSCharacterSet *letters = [NSCharacterSet letterCharacterSet];
    4. NSString *firstLetter;
    5. NSString *maxLetter = @"\uFFFF";
    6. NSString *compareString1 = obj1;
    7. firstLetter = [obj1 substringToIndex:1];
    8. if ([firstLetter rangeOfCharacterFromSet:letters].location == NSNotFound)
    9. {
    10. // Not a letter, so add a special character to force the entry to the end
    11. compareString1 = [maxLetter stringByAppendingString:compareString1];
    12. }
    13. NSString *compareString2 = obj2;
    14. firstLetter = [obj2 substringToIndex:1];
    15. if ([firstLetter rangeOfCharacterFromSet:letters].location == NSNotFound)
    16. {
    17. // Not a letter, so add a special character to force the entry to the end
    18. compareString2 = [maxLetter stringByAppendingString:compareString2];
    19. }
    20. return [compareString1 localizedCaseInsensitiveCompare:compareString2];
    21. }]];
    Alles anzeigen


    HTH, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.