알파벳순으로 NSArray를 정렬하는 방법?


답변:


725

가장 간단한 방법은 정렬 선택기를 제공하는 것입니다 ( 자세한 내용은 Apple 설명서 ).

목표 -C

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

빠른

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

Apple은 알파벳 정렬을위한 여러 선택기를 제공합니다.

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

빠른

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

참고


5
문서 링크가 오래되었으며 코드 샘플로는 실제로 배열을 정렬하기에 충분하지 않습니다. localizedCaseInsensitiveCompare : 어떻게 든 정의해야합니다.
M. Ryan

34
링크를 업데이트했습니다. 지적 해 주셔서 감사합니다. localizedCaseInsensitiveCompare :는 NSString의 메소드이며 문자열 배열을 정렬하기에 충분해야합니다.
Thomas Zoechling

1
그리고 이것은 NSString뿐만 아니라 모든 사용자 정의 객체를 포함하는 배열에 쉽게 적용될 수 있습니다. 배열 내의 모든 객체가 선택자가 지정하고 있다는 메시지를 구현했는지 확인해야합니다. 그런 다음이 메시지 내에서 비교하려는 객체의 속성에 대해 NSString 비교를 호출합니다.
lgdev

이러한 단순한 것들이 그렇게 복잡해서는 안됩니다.
Dmitry

276

여기에 언급 된 다른 답변은 @selector(localizedCaseInsensitiveCompare:) 이것을 사용하여 NSString 배열에 효과적이지만 다른 유형의 객체로 확장하고 'name'속성에 따라 객체를 정렬하려면 대신이 작업을 수행해야합니다.

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

객체는 해당 객체의 이름 속성에 따라 정렬됩니다.

정렬을 대소 문자를 구분하지 않으려면 설명자를 다음과 같이 설정해야합니다.

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

14
+1 감사합니다. 웃기는 이것은 허용 된 답변보다 더 일반적인 사용 사례입니다.
Vinay W

4
이것은 대문자와 소문자를 정렬합니다
HarshIT

+1, 선택자와 함께 정렬 설명자는 정확히 내가 원하는 것이며 다른 대답은 없습니다. 고마워
Ganesh Somani

1
name유효한 키가 아니기 때문에 이런 방식으로 문자열 배열을 정렬하려고하면 오류가 발생 합니다. NSSortDescriptor로 문자열을 알파벳순으로 정렬하는 데 어떤 키를 사용합니까?
temporary_user_name 21

27

NSNumericSearch와 같은 것을 사용하기 위해 NSString 목록을 정렬하는보다 강력한 방법 :

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

SortDescriptor와 결합하면 다음과 같은 결과가 나타납니다.

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

10

알파벳순으로 정렬하려면 아래 코드를 사용하십시오.

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

아래는 콘솔 로그입니다.

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

문자열 배열을 정렬하는 또 다른 쉬운 방법은 다음과 같이 NSString description속성 을 사용하는 것입니다.

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

1
조금 쓸모없는 것 같습니다. 이런 식으로 문자열을 정렬 할 이유가 없으며 (그렇게하면 성능이 저하 될 수 있습니다) 다른 객체의 경우 설명 속성이 정렬 목적에 거의 유용하지 않습니다.
mah

3

이것은 이미 대부분의 목적에 대한 좋은 대답을 가지고 있지만 더 구체적인 광산을 추가 할 것입니다.

영어에서는 일반적으로 알파벳순으로 문구의 시작 부분에있는 "the"라는 단어를 무시합니다. 따라서 "미국"은 "T"가 아닌 "U"로 주문됩니다.

이것은 당신을 위해 그렇게합니다.

이것들을 카테고리로 분류하는 것이 가장 좋습니다.

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

나는 몇 년 후 방금 살펴본 결과 "a"와 "an"도 포함되어야한다는 것을 깨달았습니다. 추가하기 쉬워야합니다.
narco

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];
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.