2009-08-29 6 views

Répondre

687

L'approche est simple, de fournir un sélecteur de tri (Apple's documentation pour plus de détails)

Objective-C

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

Swift

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

d'Apple fournit plusieurs sélecteurs pour le tri alphabétique:

  • 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

Le lien de documentation est obsolète, l'exemple de code n'est pas vraiment suffisant pour réellement trier le tableau. localizedCaseInsensitiveCompare: doit être défini d'une manière ou d'une autre. –

+34

J'ai mis à jour le lien. Merci d'avoir fait remarquer cela. localizedCaseInsensitiveCompare: est une méthode de NSString et devrait être suffisante pour trier un tableau de chaînes. –

+1

Et cela peut être facilement appliqué à un tableau contenant des objets personnalisés (pas seulement NSString). Vous devez juste vous assurer que tous les objets à l'intérieur de votre tableau ont implémenté le message que le sélecteur spécifie. Ensuite, à l'intérieur de ce message, vous appelez simplement la comparaison NSString pour les propriétés de votre objet que vous souhaitez comparer. – Luka

264

Les autres réponses fournies ici mentionnent l'utilisation @selector (localizedCaseInsensitiveCompare :) Cela fonctionne très bien pour un tableau de NSString, si vous voulez étendre cela à un autre type d'objet, et trier ces objets selon une propriété « nom », vous devez le faire à la place:

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

Vos objets seront triés en fonction de la propriété du nom de ces objets.

Si vous voulez que le tri soit insensible à la casse, vous devez définir le descripteur comme celui-ci

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

+1, merci. C'est drôle le cas d'utilisation le plus commun que la réponse acceptée. –

+3

ce genre de lettres majuscules d'abord, puis les petites lettres – HarshIT

+0

J'ai édité ma réponse pour inclure le tri insensible à la casse –

25

Une façon plus puissante de trier une liste de NSString à utiliser des choses comme NSNumericSearch:

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

combiné avec SortDescriptor, qui donne quelque chose comme

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

Formidable laid pour être honnête – Mutawe

10

utilisation ci-dessous le code pour le tri par ordre alphabétique:

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); 

Ci-dessous journal de la console:

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

Une autre méthode facile à trier un tableau de chaînes consiste en utilisant la propriété NSString description cette façon :

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

Cela semble un peu inutile; il n'y a aucune raison de trier les chaînes de cette façon (et il y a probablement un coup de performance pour le faire), et pour d'autres objets, sa propriété de description est rarement utile pour le tri. – mah

0

Ceci a déjà de bonnes réponses pour la plupart purp oses, mais je vais ajouter le mien qui est plus spécifique.

En anglais, normalement quand nous alphabétisons, nous ignorons le mot "the" au début d'une phrase. Ainsi, les «États-Unis» seraient classés sous «U» et non «T».

Cela fait cela pour vous.

Il serait probablement préférable de les mettre dans les catégories.

// 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; 
} 
Questions connexes