0

私のNSMutableArray中には、ソートする必要があるこれらの値があります。

+0.00,
+0.00,
+0.00,
+0.10,
+0.21,        
+3.04,
+3.45,
+3.56,
+4.87,
+5.01,
+5.05,
+5.40,
+6.07,
+6.57,
+6.71,
+7.54,
+7.58,
+8.11,
+8.94,
+9.42,
+9.49,
9.78,
-1.69,
-1.80,
-10.99,
-12.72,
-2.30,
-2.64,
-2.64,
-3.12,
-4.59,
-5.11,
-5.83,
-6.54,
-6.64

ソート用の私のコード、

NSSortDescriptor * frequencyDescriptor = [[NSSortDescriptor alloc] initWithKey:ytd 
                                                                      ascending:YES];

id obj;
NSEnumerator * enumerator = [array objectEnumerator];
while ((obj = [enumerator nextObject])) NSLog(@"%@", obj);

NSArray * descriptors = [NSArray arrayWithObjects:frequencyDescriptor, nil];
NSArray * sortedArray = [array sortedArrayUsingDescriptors:descriptors];

NSLog(@"\nSorted ...");
enumerator = [sortedArray objectEnumerator];
while ((obj = [enumerator nextObject])) NSLog(@"%@", obj);

私が得る出力、

2013-09-17 13:00:28.315 Pondo MF[1275:c07] +0.00
2013-09-17 13:00:28.316 Pondo MF[1275:c07] +0.00
2013-09-17 13:00:28.316 Pondo MF[1275:c07] +0.00
2013-09-17 13:00:28.316 Pondo MF[1275:c07] +0.10
2013-09-17 13:00:28.317 Pondo MF[1275:c07] +0.21
2013-09-17 13:00:28.317 Pondo MF[1275:c07] +0.34
2013-09-17 13:00:28.317 Pondo MF[1275:c07] +0.68
2013-09-17 13:00:28.317 Pondo MF[1275:c07] +1.35
2013-09-17 13:00:28.318 Pondo MF[1275:c07] +18.59
2013-09-17 13:00:28.318 Pondo MF[1275:c07] +3.04
2013-09-17 13:00:28.318 Pondo MF[1275:c07] +3.45
2013-09-17 13:00:28.319 Pondo MF[1275:c07] +3.56
2013-09-17 13:00:28.319 Pondo MF[1275:c07] +4.87
2013-09-17 13:00:28.319 Pondo MF[1275:c07] +5.01
2013-09-17 13:00:28.319 Pondo MF[1275:c07] +5.05
2013-09-17 13:00:28.320 Pondo MF[1275:c07] +5.40
2013-09-17 13:00:28.320 Pondo MF[1275:c07] +6.07
2013-09-17 13:00:28.320 Pondo MF[1275:c07] +6.57
2013-09-17 13:00:28.320 Pondo MF[1275:c07] +6.71
2013-09-17 13:00:28.321 Pondo MF[1275:c07] +7.54
2013-09-17 13:00:28.321 Pondo MF[1275:c07] +7.58
2013-09-17 13:00:28.321 Pondo MF[1275:c07] +8.11
2013-09-17 13:00:28.322 Pondo MF[1275:c07] +8.94
2013-09-17 13:00:28.322 Pondo MF[1275:c07] +9.42
2013-09-17 13:00:28.322 Pondo MF[1275:c07] +9.49
2013-09-17 13:00:28.322 Pondo MF[1275:c07] +9.78
2013-09-17 13:00:28.323 Pondo MF[1275:c07] -1.69
2013-09-17 13:00:28.323 Pondo MF[1275:c07] -1.80
2013-09-17 13:00:28.323 Pondo MF[1275:c07] -10.99
2013-09-17 13:00:28.323 Pondo MF[1275:c07] -12.72
2013-09-17 13:00:28.324 Pondo MF[1275:c07] -2.30
2013-09-17 13:00:28.324 Pondo MF[1275:c07] -2.64
2013-09-17 13:00:28.324 Pondo MF[1275:c07] -2.64
2013-09-17 13:00:28.324 Pondo MF[1275:c07] -3.12
2013-09-17 13:00:28.325 Pondo MF[1275:c07] -4.59
2013-09-17 13:00:28.325 Pondo MF[1275:c07] -5.11
2013-09-17 13:00:28.325 Pondo MF[1275:c07] -5.83
2013-09-17 13:00:28.326 Pondo MF[1275:c07] -6.54
2013-09-17 13:00:28.326 Pondo MF[1275:c07] -6.64

ソートされた配列は+18.59最初の値として開始する必要があるため、これは正しくありません。私のコードはどこで間違っていますか? それを修正するための指針はありますか?

4

2 に答える 2

3

NSComparator ブロックを使用して配列を並べ替えることができます。それは非常に簡単です:

[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    float f1 = [obj1 floatValue];
    float f2 = [obj2 floatValue];
    if(f1<f2)
        return NSOrderedDescending;
    else if(f1>f2)
        return NSOrderedAscending;
    else
        return NSOrderedSame;
}];

その場合、配列は降順にソートされます。昇順で並べ替えたい場合は、ブロック内の NSOrderedDescending と NSOrderedAscending を交換するだけです。

于 2013-09-17T08:36:50.553 に答える
2

compare:数値が文字列であると仮定して、それらの文字列を NSNumbers に変換し、「 」セレクターを使用して並べ替える方法を示す関数を作成しました。

- (void) demonstrateSorting
{
    NSArray * unsortedArray = @[ @"+0.00",@"+0.00",@"+0.00",@"+0.10",@"+0.21", \
                                 @"+3.04",@"+3.45",@"+3.56",@"+4.87",@"+5.01",@"+5.05",@"+5.40",@"+6.07",@"+6.57",@"+6.71",\
                                 @"+7.54",@"+7.58",@"+8.11",@"+8.94",@"+9.42",@"+9.49",@"9.78",@"-1.69",@"-1.80",\
                                 @"-10.99",@"-12.72",@"-2.30",@"-2.64",@"-2.64",@"-3.12",@"-4.59",@"-5.11",\
                                 @"-5.83",@"-6.54",@"-6.64"];

    NSMutableArray * arrayOfNumbers = [[NSMutableArray alloc] initWithCapacity: [unsortedArray count]];
    for(NSString * someNumberString in unsortedArray)
    {
        NSNumber * number = [NSNumber numberWithFloat:[someNumberString floatValue]];
        [arrayOfNumbers addObject: number];
    }

    id obj;
    NSEnumerator * enumerator = [arrayOfNumbers objectEnumerator];
    while ((obj = [enumerator nextObject])) NSLog(@"%@", obj);

    NSArray * sortedArray =
    [arrayOfNumbers sortedArrayUsingSelector:@selector(compare:)];

    NSLog(@"\nSorted ...");

    enumerator = [sortedArray objectEnumerator];
    while ((obj = [enumerator nextObject])) NSLog(@"%@", obj);
}
于 2013-09-17T08:30:15.680 に答える