NSCounted按计数设置顺序



有谁知道如何获取对象的NSCountedSet并按对象计数顺序创建这些对象的数组?(从高到低)

    NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:array2];
    NSMutableArray *dictArray = [NSMutableArray array];
    [countedSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
        [dictArray addObject:@{@"object": obj,
                               @"count": @([countedSet countForObject:obj])}];
    }];
    NSLog(@"Objects sorted by count: %@", [dictArray sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"count" ascending:NO]]]);

在上面的代码中,array2是一个由 100 个随机字符串组成的数组,每个字符串有两个字母。 sortedArrayUsingDescriptors: ,返回一个排序的数组,在本例中,它按对象计数降序排序。

这是实现相同结果的另一种方法:

NSArray *sortedValues = [countedSet.allObjects sortedArrayUsingComparator:^(id obj1, id obj2) {
    NSUInteger n = [countedSet countForObject:obj1];
    NSUInteger m = [countedSet countForObject:obj2];
    return (n <= m)? (n < m)? NSOrderedAscending : NSOrderedSame : NSOrderedDescending;
}];

要按降序获取值,您可以使用(或反转上述返回值)。

sortedValues.reverseObjectEnumerator.allObjects

对于 Swift3,您需要稍微修改一下提供的 swift 代码:

let countedSet = [1,2,2,4,6,7,8,8,5,8,1]
let sorted = countedSet.allObjects.sorted { return countedSet.count(for: $0.0) > countedSet.count(for: $0.1) }
// iterate over all items in the set
for item in countedSet {
    print("(item): Count - (countedSet.count(for: item))")
}

下面是一个 Swift 版本:

let sorted = countedSet.allObjects.sort { return countedSet.countForObject($0.0) < countedSet.countForObject($0.1) }

只需将<更改为>即可按降序排列

最新更新