1

配列をアルファベット順にソートする方法は知っていますが、NSMutableArray をオブジェクトの人気順にソートしたいと考えています。次のオブジェクトを持つ配列を想像してください。

  • B
  • B
  • B

これらのオブジェクトを人気順に並べ替えて、次のような配列を作成したいと思います。

  • B
  • B
  • B

これを行う良い迅速な方法はありますか?多分NSSortDescriptorのキー?(見つけられませんでした)

ありがとう

4

4 に答える 4

1

要するに、簡潔にするために、配列リテラルの新しい構文を使用しました。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSArray *ar = @[@"B", @"A", @"C", @"B", @"B", @"A"];
        NSCountedSet *countedSet = [NSCountedSet setWithArray:ar];
        NSArray *sorted = [ar sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            NSInteger diff = [countedSet countForObject:obj1] - [countedSet countForObject:obj2];
            if (diff < 0)
                return NSOrderedDescending;
            else if (diff > 0)
                return NSOrderedAscending;
            else
                return NSOrderedSame;
        }];
        NSLog(@"%@", ar);
        NSLog(@"%@", sorted);
    }
    return 0;
}

出力

2012-05-08 07:25:18.465 Sort[20434:303] (
    B,
    A,
    C,
    B,
    B,
    A
)
2012-05-08 07:25:18.468 Sort[20434:303] (
    B,
    B,
    B,
    A,
    A,
    C
)
于 2012-05-08T14:25:47.380 に答える
0

これはあなたのために働くはずです。

NSArray *array = [[NSArray alloc] initWithObjects:@"A", @"A", @"B", @"B", @"B", @"C", nil];
NSMutableDictionary *occurenceOfValues = [[NSMutableDictionary alloc] init];
for (id value in array) {
    NSNumber *count = [occurenceOfValues objectForKey:value];
    [occurenceOfValues setValue:[NSNumber numberWithInt:[count intValue] + 1] forKey:value];
}
NSArray *valuesInOrder = [[[occurenceOfValues keysSortedByValueUsingSelector:@selector(compare:)] reverseObjectEnumerator] allObjects];
NSMutableArray *sortedArray = [[NSMutableArray alloc] initWithCapacity:array.count];
for (id value in valuesInOrder) {
    NSNumber *count = [occurenceOfValues objectForKey:value];
    for (int i = 0; i < [count intValue]; i++) {
        [sortedArray addObject:value];
    }
}
NSLog(@"%@", sortedArray);

コンソール出力:

2012-05-08 09:20:15.805 SortArrayPopularity [25206:f803](B、B、B、A、A、C)

于 2012-05-08T14:21:23.040 に答える
0
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"theSortKey"
                                              ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors];

このスレッドも参照

カスタムオブジェクトを含む NSMutableArray をソートする方法は?

于 2012-05-08T14:02:44.880 に答える
0

A、B、C ...をキーとして持つ辞書を使用し、デフォルト値を0に設定します

次に、配列を列挙し、対応するキーの数を増やします。

最後に、[dict allKeys] によって返されたキー配列を並べ替えます。

于 2012-05-08T14:24:13.460 に答える