2009-08-29 2 views

Antwort

687

Der einfachste Ansatz ist, eine Art Selektor (Apple's documentation für weitere Details) zu liefern

Objective-C

sortedArray = [anArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

Swift

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "YourKey", ascending: true, selector: "localizedCaseInsensitiveCompare:") 
let sortedResults: NSArray = temparray.sortedArrayUsingDescriptors([descriptor]) 

Apfel liefert mehrere Selektoren für alphabetische Sortierung:

  • compare:
  • caseInsensitiveCompare:
  • localizedCompare:
  • localizedCaseInsensitiveCompare:
  • localizedStandardCompare:

Swift

var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"] 
students.sort() 
print(students) 
// Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]" 

Reference

+5

Dokumentationsverknüpfung ist veraltet, Codebeispiel ist nicht wirklich genug, um das Array tatsächlich zu sortieren. localizedCaseInsensitiveCompare: muss irgendwie definiert werden. –

+34

Ich habe den Link aktualisiert. Danke, dass du darauf hingewiesen hast. localizedCaseInsensitiveCompare: ist eine Methode von NSString und sollte ausreichen, um ein Array von Strings zu sortieren. –

+1

Und dies kann leicht auf ein Array angewendet werden, das beliebige benutzerdefinierte Objekte enthält (nicht nur NSString). Sie müssen nur sicherstellen, dass alle Objekte in Ihrem Array die vom Selektor angegebene Nachricht implementiert haben. Dann rufen Sie in dieser Nachricht einfach den NSString-Vergleich für die Eigenschaften Ihres Objekts auf, das Sie vergleichen möchten. – Luka

264

Die anderen Antworten hier erwähnen versehen mit @selector (localizedCaseInsensitiveCompare :) Dies funktioniert gut für eine Reihe von NSString, aber wenn Sie dies auf eine andere Art von Objekt erweitern möchten, und sortieren diese Objekte nach einer Eigenschaft ‚Name‘, sollten Sie diese stattdessen tun:

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; 
sortedArray=[anArray sortedArrayUsingDescriptors:@[sort]]; 

Ihre Objekte nach dem Namen Eigenschaft dieser Objekte sortiert werden.

Wenn Sie die Sortierung sein wollen Groß- und Kleinschreibung, würden Sie den Deskriptor wie dieses

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
+13

+1, Danke. Lustig, das ist der häufigere Anwendungsfall als die angenommene Antwort. –

+3

sortiert Großbuchstaben zuerst und dann kleine Buchstaben – HarshIT

+0

Ich bearbeitete meine Antwort, um die Groß- und Kleinschreibung sortierend zu enthalten –

25

eine leistungsfähigere Art und Weise des Sortierens eine Liste von NSString festlegen müssen Dinge wie NSNumericSearch zu verwenden:

NSArray *sortedArrayOfString = [arrayOfString sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
      return [(NSString *)obj1 compare:(NSString *)obj2 options:NSNumericSearch]; 
     }]; 

mit SortDescriptor Kombiniert, dass so etwas geben würde:

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) { 
     return [(NSString *)obj1 compare:(NSString *)obj2 options:NSNumericSearch]; 
    }]; 
NSArray *sortedArray = [anArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]]; 
1
-(IBAction)SegmentbtnCLK:(id)sender 
{ [self sortArryofDictionary]; 
    [self.objtable reloadData];} 
-(void)sortArryofDictionary 
{ NSSortDescriptor *sorter; 
    switch (sortcontrol.selectedSegmentIndex) 
    {case 0: 
      sorter=[[NSSortDescriptor alloc]initWithKey:@"Name" ascending:YES]; 
      break; 
     case 1: 
      sorter=[[NSSortDescriptor alloc]initWithKey:@"Age" ascending:YES]; 
      default: 
      break; } 
    NSArray *sortdiscriptor=[[NSArray alloc]initWithObjects:sorter, nil]; 
    [arr sortUsingDescriptors:sortdiscriptor]; 
    } 
+0

Hässliche Formatierung um ehrlich zu sein – Mutawe

10

Verwenden Code unten in alphabetischer Reihenfolge Reihenfolge:

NSArray *unsortedStrings = @[@"Verdana", @"MS San Serif", @"Times New Roman",@"Chalkduster",@"Impact"]; 

    NSArray *sortedStrings = 
    [unsortedStrings sortedArrayUsingSelector:@selector(compare:)]; 

    NSLog(@"Unsorted Array : %@",unsortedStrings);   
    NSLog(@"Sorted Array : %@",sortedStrings); 

Unten ist log Konsole:

2015-04-02 16:17:50.614 ToDoList[2133:100512] Unsorted Array : (
    Verdana, 
    "MS San Serif", 
    "Times New Roman", 
    Chalkduster, 
    Impact 
) 

2015-04-02 16:17:50.615 ToDoList[2133:100512] Sorted Array : (
    Chalkduster, 
    Impact, 
    "MS San Serif", 
    "Times New Roman", 
    Verdana 
) 
10

Eine andere einfache Methode, ein Array von Strings unter Verwendung der NSString description Eigenschaft Auf diese Weise besteht sortieren :

NSSortDescriptor *valueDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES]; 
    arrayOfSortedStrings = [arrayOfNotSortedStrings sortedArrayUsingDescriptors:@[valueDescriptor]]; 
+0

Das scheint ein bisschen nutzlos; Es gibt keinen Grund, Zeichenfolgen auf diese Weise zu sortieren (und es gibt wahrscheinlich einen Leistungseinbruch), und für andere Objekte ist seine Beschreibungseigenschaft selten zum Sortieren nützlich. – mah

0

Dies hat bereits gute Antworten für die meisten Purp oses, aber ich werde meine hinzufügen, die spezifischer ist.

In Englisch, normalerweise, wenn wir alphabetisch schreiben, ignorieren wir das Wort "das" am Anfang eines Satzes. Also "Die Vereinigten Staaten" würde unter "U" und nicht "T" bestellt werden.

Das macht das für Sie.

Es wäre wahrscheinlich am besten, diese in Kategorien einzuordnen.

// Sort an array of NSStrings alphabetically, ignoring the word "the" at the beginning of a string. 

-(NSArray*) sortArrayAlphabeticallyIgnoringThes:(NSArray*) unsortedArray { 

    NSArray * sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(NSString* a, NSString* b) { 

     //find the strings that will actually be compared for alphabetical ordering 
     NSString* firstStringToCompare = [self stringByRemovingPrecedingThe:a]; 
     NSString* secondStringToCompare = [self stringByRemovingPrecedingThe:b]; 

     return [firstStringToCompare compare:secondStringToCompare]; 
    }]; 
    return sortedArray; 
} 

// Remove "the"s, also removes preceding white spaces that are left as a result. Assumes no preceding whitespaces to start with. nb: Trailing white spaces will be deleted too. 

-(NSString*) stringByRemovingPrecedingThe:(NSString*) originalString { 
    NSString* result; 
    if ([[originalString substringToIndex:3].lowercaseString isEqualToString:@"the"]) { 
     result = [[originalString substringFromIndex:3] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
    } 
    else { 
     result = originalString; 
    } 
    return result; 
}