2012-04-30 33 views
0

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

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

http://stackoverflow.com/questions/8242735/how-to-sort-array-controller-alphabetically-with-numbers-last-in-objective-c –

答えて

5

comparator blocksを使用できます。最初のオブジェクトが始まる場合return [obj1 compare:obj2]

  • を行い、それらの両方の数字や文字があり、

    • チェック二つの文字列の最初の文字:あなたのケースでは

      は、ブロックは、次の手順を実行しなければなりません取得するための番号が、文字と二、return NSOrderedAscending、それは他の方法で回避された場合、return NSOrderedDescending

    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の:最初の文字、[obj1 substringToIndex:1]


    このアイデアの完全なコードを使用します。 sortUsingComparator:のコンパレータでは、インプレース順を使用できます。

    [array sortUsingBlock:<The block stays the same>]; 
    
  • +0

    素晴らしいありがとう! – rocky

    関連する問題