0

次のように適切にソートされたバージョン番号の配列をソートしようとしています。

1.0.1
1.1.2
1.2.0
1.10.3
2.1.1
2.2.2
2.10.2

配列があり、次のことを行います。

NSArray *allUpdatekeys = [allUpdatekeystmp sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

これにより、次のようなリストが生成されます。

1.0.1
1.1.2
1.10.3
1.2.0
...

そこで、カスタムセレクターを書いてみましたが、見つけた例を見てここまで来ました:

 - (NSComparisonResult)versionCompare:(NSString*) secondVersion  {
     NSArray *secondVer = [secondVersion componentsSeparatedByString:@"."];
     NSString *firstVersion = [];
     NSArray *firstVer = [firstVersion componentsSeparatedByString:@"."];
     NSUInteger firstPri = [firstVer[0] integerValue];
     NSUInteger firstSec = [firstVer[1] integerValue];
     NSUInteger firstTer = [firstVer[2] integerValue];
     NSUInteger secondPri = [secondVer[0] integerValue];
     NSUInteger secondSec = [secondVer[1] integerValue];
     NSUInteger secondTer = [secondVer[2] integerValue];
     NSLog(@"In the version compare method");
     NSLog(@"first %@ second %@ ", self, secondVersion);
     if (firstPri < secondPri) {
         return NSOrderedAscending;
     }
     else if (firstPri  secondPri) {
         return NSOrderedDescending;
     } else {
         if (firstSec < secondSec) {
             return NSOrderedAscending;
         }
         else if (firstSec  secondSec) {
             return NSOrderedDescending;
         }
         else {
             if (firstTer < secondTer) {
                 return NSOrderedAscending;
             }
             else if (firstTer  secondTer) {
                 return NSOrderedDescending;
             }
             else {
                 return NSOrderedSame;
             }
         }
     } }

私の質問: 最初のバージョンを参照する方法は? 基本的に配列の最初の文字列が必要です。私はこれを理解するために頭を悩ませてきましたが、私が見つけたすべての例も機能しません。それが役立つか重要な場合は、10.8でXcode 4.4を使用しています。

4

2 に答える 2

3

localizedStandardCompareはあなたが探しているものだと思います:

NSArray *theArray = [NSArray arrayWithObjects:    
                     @"1.0.1",
                     @"1.1.2",
                     @"1.2.0",
                     @"1.10.3",
                     @"2.1.1",
                     @"2.2.2",
                     @"2.10.2",
                     nil];

NSArray *sortedArray  = [[NSArray alloc] initWithArray:[theArray sortedArrayUsingSelector:@selector(localizedStandardCompare:)]];

NSLog(@"%@", sortedArray);

出力:

(
    "1.0.1",
    "1.1.2",
    "1.2.0",
    "1.10.3",
    "2.1.1",
    "2.2.2",
    "2.10.2"
)
于 2012-08-01T21:17:48.557 に答える
1

1.2.0 が 1.10.3 より小さいソート済み配列を取得する別の解決策は、配列が数値的にソートされていることを意味します。

allUpdatekeys = [allUpdatekeystmp sortedArrayUsingFunction:cmp context:NULL];

関数で:

NSComparisonResult cmp( id val1, id val2, void *context ){
   return [val1 compare:num2 options:NSNumericSearch | NSCaseInsensitiveSearch];
}
于 2012-08-02T08:49:28.523 に答える