NSArrayをアルファベット順に並べ替える方法は?


375

で埋められた配列[UIFont familyNames]をアルファベット順にソートするにはどうすればよいですか?

回答:


725

最も簡単なアプローチは、ソートセレクターを提供することです(詳細はAppleのドキュメント

Objective-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.ライアン

34
リンクを更新しました。ご指摘いただきありがとうございます。localizedCaseInsensitiveCompare:はNSStringのメソッドであり、文字列の配列をソートするには十分です。
Thomas Zoechling 2010

1
また、これは、(NSStringだけでなく)カスタムオブジェクトを含む配列に簡単に適用できます。配列内のすべてのオブジェクトがセレクターが指定しているメッセージを実装していることを確認する必要があります。次に、このメッセージ内で、比較するオブジェクトのプロパティに対してNSString compareを呼び出すだけです。
lgdev 2012年

そのような単純なことはそれほど複雑であってはなりません。
ドミトリー

276

ここで提供されている他の回答は、@selector(localizedCaseInsensitiveCompare:) これを使用したNSStringの配列に適していますが、これを別のタイプのオブジェクトに拡張し、それらのオブジェクトを「name」プロパティに従ってソートする場合は、代わりにこれを行う必要があります。

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

オブジェクトは、それらのオブジェクトのnameプロパティに従ってソートされます。

ソートで大文字と小文字を区別しない場合は、次のように記述子を設定する必要があります

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

14
+1、ありがとうございます。面白いことに、これは受け入れられた回答よりも一般的な使用例です。
Vinay W

4
これは、最初に大文字をソートし、次に小文字をソートします
HarshIT

+1、ソート記述子とセレクターはまさに私が欲しかったものであり、他の答えはこれを持っていませんでした。
どうも

1
nameが有効なキーではないため、この方法で文字列の配列をソートしようとすると、エラーが発生します。NSSortDescriptorで文字列をアルファベット順に並べ替えるには、どのキーを使用しますか?
temporary_user_name

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

文字列の配列をソートするもう1つの簡単な方法は、NSString descriptionプロパティを次のように使用することです。

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

1
それは少し役に立たないようです。この方法で文字列を並べ替える理由はありません(そうすることでパフォーマンスが低下する可能性があります)。他のオブジェクトでは、その説明プロパティが並べ替えの目的で役立つことはほとんどありません。
mah

3

これはほとんどの目的ですでに良い答えを持っていますが、より具体的な私のものを追加します。

英語では、通常、アルファベット順に並べるとき、フレーズの先頭にある「the」という単語は無視されます。したがって、「The United States」は「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.