0

{apple、queen、microsoft、50cent} のような配列値があります。配列をアルファベット順に並べ替え、最後に 50cent にしたい。私は次の方法でやっていますが、50セントを上にソートします:

[albums sortUsingDescriptors:[NSArray arrayWithObject:
                                  [[[NSSortDescriptor alloc] 
                                    initWithKey:@"name" 
                                    ascending:YES 
                                    selector:@selector(localizedCaseInsensitiveCompare:)] 
                                   autorelease]]];
4

1 に答える 1

5

比較ブロックを使用できます。

あなたの場合、ブロックは次のことを行う必要があります。

  • 2 つの文字列の最初の文字を確認してください。どちらも数字か文字ですか。return [obj1 compare:obj2]

  • 最初のオブジェクトが数字で始まり、2 番目のオブジェクトが文字で始まるreturn NSOrderedAscending場合、逆の場合、return NSOrderedDescending

最初の文字を取得するには、使用します[obj1 substringToIndex:1]


このアイデアの完全なコード:

NSArray *array = [NSArray arrayWithObjects:@"peach",@"apple",@"banana",@"ananas",@"50cents", @"papaya", nil];

array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *s1 = [obj1 substringToIndex:1];
    NSString *s2 = [obj2 substringToIndex:1];

    if ([s1 rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location == [s2 rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location) {
        return  [obj1 compare:obj2];
    } else {
        if ([s1 rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location == NSNotFound) {
            return NSOrderedAscending;
        }
    }
    return  NSOrderedDescending;
}];

を使用するときはsortUsingDescriptors:、NSMutableArray を使用している必要があります。のコンパレータでインプレース順序付けを使用できますsortUsingComparator:

[array sortUsingBlock:<The block stays the same>];
于 2012-04-30T09:51:38.833 に答える