How to sort a NSArray alphabetically?

前端 未结 7 1093
借酒劲吻你
借酒劲吻你 2020-11-22 15:32

How can I sort an array filled with [UIFont familyNames] into alphabetical order?

相关标签:
7条回答
  • 2020-11-22 16:13

    Use below code for sorting in alphabetical order:

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

    Below is console log :

    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
    )
    
    0 讨论(0)
  • 2020-11-22 16:15

    Another easy method to sort an array of strings consists by using the NSString description property this way:

    NSSortDescriptor *valueDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];
    arrayOfSortedStrings = [arrayOfNotSortedStrings sortedArrayUsingDescriptors:@[valueDescriptor]];
    
    0 讨论(0)
  • 2020-11-22 16:19
    -(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 讨论(0)
  • 2020-11-22 16:20

    This already has good answers for most purposes, but I'll add mine which is more specific.

    In English, normally when we alphabetise, we ignore the word "the" at the beginning of a phrase. So "The United States" would be ordered under "U" and not "T".

    This does that for you.

    It would probably be best to put these in categories.

    // 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;
    }
    
    0 讨论(0)
  • 2020-11-22 16:23

    The simplest approach is, to provide a sort selector (Apple's documentation for details)

    Objective-C

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

    Swift

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

    Apple provides several selectors for alphabetic sorting:

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

    Swift

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

    Reference

    0 讨论(0)
  • 2020-11-22 16:23

    A more powerful way of sorting a list of NSString to use things like NSNumericSearch :

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

    Combined with SortDescriptor, that would give something like :

    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]];
    
    0 讨论(0)
提交回复
热议问题